From 74824de9ade4dfab6ed581d49affad9882ef65fa Mon Sep 17 00:00:00 2001 From: Artem Date: Fri, 28 Oct 2022 23:53:19 +0300 Subject: [PATCH 1/9] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA,=20=D0=B0=20=D1=82=D0=B0?= =?UTF-8?q?=D0=BA=D0=B6=D0=B5=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sortMergeList/sortMergeList.sln | 31 ++++ sortMergeList/sortMergeList/list.c | 85 ++++++++++ sortMergeList/sortMergeList/list.h | 17 ++ sortMergeList/sortMergeList/main.c | 90 ++++++++++ .../sortMergeList/sortMergeList.vcxproj | 154 ++++++++++++++++++ .../sortMergeList.vcxproj.filters | 35 ++++ sortMergeList/sortMergeList/text.txt | 4 + 7 files changed, 416 insertions(+) create mode 100644 sortMergeList/sortMergeList.sln create mode 100644 sortMergeList/sortMergeList/list.c create mode 100644 sortMergeList/sortMergeList/list.h create mode 100644 sortMergeList/sortMergeList/main.c create mode 100644 sortMergeList/sortMergeList/sortMergeList.vcxproj create mode 100644 sortMergeList/sortMergeList/sortMergeList.vcxproj.filters create mode 100644 sortMergeList/sortMergeList/text.txt diff --git a/sortMergeList/sortMergeList.sln b/sortMergeList/sortMergeList.sln new file mode 100644 index 0000000..b97827a --- /dev/null +++ b/sortMergeList/sortMergeList.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sortMergeList", "sortMergeList\sortMergeList.vcxproj", "{52C388A5-2C1A-4EBE-8425-B1D08A3B1ED6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {52C388A5-2C1A-4EBE-8425-B1D08A3B1ED6}.Debug|x64.ActiveCfg = Debug|x64 + {52C388A5-2C1A-4EBE-8425-B1D08A3B1ED6}.Debug|x64.Build.0 = Debug|x64 + {52C388A5-2C1A-4EBE-8425-B1D08A3B1ED6}.Debug|x86.ActiveCfg = Debug|Win32 + {52C388A5-2C1A-4EBE-8425-B1D08A3B1ED6}.Debug|x86.Build.0 = Debug|Win32 + {52C388A5-2C1A-4EBE-8425-B1D08A3B1ED6}.Release|x64.ActiveCfg = Release|x64 + {52C388A5-2C1A-4EBE-8425-B1D08A3B1ED6}.Release|x64.Build.0 = Release|x64 + {52C388A5-2C1A-4EBE-8425-B1D08A3B1ED6}.Release|x86.ActiveCfg = Release|Win32 + {52C388A5-2C1A-4EBE-8425-B1D08A3B1ED6}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {5E87B8FF-54CB-4657-979C-60D9F843C47C} + EndGlobalSection +EndGlobal diff --git a/sortMergeList/sortMergeList/list.c b/sortMergeList/sortMergeList/list.c new file mode 100644 index 0000000..45c459e --- /dev/null +++ b/sortMergeList/sortMergeList/list.c @@ -0,0 +1,85 @@ +#include "list.h" +#include +#include + +typedef struct Node { + char number[100]; + char name[100]; + struct Node* next; +} Node; + +struct List { + Node* head; +}; + +bool isEmpty(List* list) { + return list->head == NULL; +} + +void mergeSortByName(List* list, int size) { + +} + +void mergeSortByNumber(List* list, int size) { + + +} + +int addRecord(List* list, char name[], char number[]) { + Node* newNode = calloc(1, sizeof(Node)); + if (newNode == NULL) { + return -1; + } + size_t sizeName = strlen(name); + memset(newNode->name, 0, strlen(newNode->name)); + strncpy(newNode->name, name, sizeName); + + size_t sizeNumber = strlen(number); + memset(newNode->number, 0, strlen(newNode->number)); + strncpy(newNode->number, number, sizeNumber); + + newNode->next = NULL; + + if (list->head == NULL) { + list->head = newNode; + return ; + } + + Node* walker = list->head; + while (walker->next != NULL) { + walker = walker->next; + } + walker->next = newNode; + +} + +List* createList(void) { + List* list = calloc(1, sizeof(List)); + return list; +} + +bool isSortedByNumber(List* list) { + if (list->head == NULL || list->head->next == NULL) { + return true; + } + Node* walker = list->head; + char number[100] = { '\0' }; + strncpy(number, walker->number, strlen(walker->number)); + walker = walker->next; + while (walker->next != NULL) { + size_t sizeNumber = strlen(number); + size_t sizeListNumber = strlen(walker->number); + int i = 0; + while (i < sizeNumber && i < sizeListNumber) { + if (number[i] > walker->number[i]) { + return false; + } else if (number[i] < walker->number[i]) { + break; + } + } + memset(number, 0, strlen(number)); + strncpy(number, walker, strlen(walker->number)); + walker = walker->next; + } + return true; +} \ No newline at end of file diff --git a/sortMergeList/sortMergeList/list.h b/sortMergeList/sortMergeList/list.h new file mode 100644 index 0000000..7850d81 --- /dev/null +++ b/sortMergeList/sortMergeList/list.h @@ -0,0 +1,17 @@ +#pragma once +#include +#include + +typedef struct List List; + +bool isEmpty(List* list); + +List* createList(void); + +int addRecord(List* list, char name[], char number[]); + +void mergeSortByName(List* list, int size); + +void mergeSortByNumber(List* list, int size); + +bool isSortedByNumber(List* list); \ No newline at end of file diff --git a/sortMergeList/sortMergeList/main.c b/sortMergeList/sortMergeList/main.c new file mode 100644 index 0000000..1e4884a --- /dev/null +++ b/sortMergeList/sortMergeList/main.c @@ -0,0 +1,90 @@ +#include +#include +#include +#include +#include +#include "list.h" + +int scanOne(); + +bool readFromFile(char fileName[], int sortByNameOrNumber) { + List* list = createList(); + + FILE* file = fopen(fileName, "r"); + if (file == NULL) { + printf("!"); + return false; + } + char letter = 0; + char name[100] = { '\0' }; + char number[100] = { '\0' }; + char buffer[100] = { '\0' }; + int stringInfile = 0; + while (fscanf(file, "%s", buffer) == 1) { + size_t sizeBuffer = strlen(buffer); + size_t i = 0; + if (stringInfile == 0) { + while (i < sizeBuffer) { + name[i] = buffer[i]; + ++i; + } + } + if (stringInfile == 2) { + while (i < sizeBuffer) { + number[i] = buffer[i]; + ++i; + } + addRecord(list, name, number); + memset(name, 0, strlen(name)); + memset(number, 0, strlen(number)); + stringInfile = -1; + } + ++stringInfile; + } + fclose(file); + if (sortByNameOrNumber == 0) { + mergeSortByNumber(list, 2); + } else if (sortByNameOrNumber == 1) { + mergeSortByName(list, 2); + } + + if (strcmp(fileName, "test.txt") == 0) { + return isSortedByNumber(list); + } +} + +bool test(void) { + return readFromFile("test.txt", 1); +} + +int main() { + setlocale(LC_ALL, "RUS"); + char fileName[100] = { '\0' }; + printf(" , ( : test.txt)\n"); + int checkScan = scanf("%s", &fileName); + + while (strcmp(fileName, "test.txt") == 0 || checkScan != 1) { + while (getchar() != '\n') { + } + printf("\n"); + checkScan = scanf("%s", &fileName); + } + printf(" (0 - , 1 - )\n"); + int sortByNameOrNumber = scanOne(); + readFromFile(fileName, sortByNameOrNumber); +} + +int scanOne() { + int number = 0; + int checkScanf = scanf("%d", &number); + + while (checkScanf != 1) { + while (getchar() != '\n') { + } + + printf("...\n"); + checkScanf = scanf("%d", &number); + } + + return number; +} \ No newline at end of file diff --git a/sortMergeList/sortMergeList/sortMergeList.vcxproj b/sortMergeList/sortMergeList/sortMergeList.vcxproj new file mode 100644 index 0000000..baaaf87 --- /dev/null +++ b/sortMergeList/sortMergeList/sortMergeList.vcxproj @@ -0,0 +1,154 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {52c388a5-2c1a-4ebe-8425-b1d08a3b1ed6} + sortMergeList + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + false + + + true + + + false + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + false + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sortMergeList/sortMergeList/sortMergeList.vcxproj.filters b/sortMergeList/sortMergeList/sortMergeList.vcxproj.filters new file mode 100644 index 0000000..3fff1a1 --- /dev/null +++ b/sortMergeList/sortMergeList/sortMergeList.vcxproj.filters @@ -0,0 +1,35 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Исходные файлы + + + Исходные файлы + + + + + Исходные файлы + + + + + Исходные файлы + + + \ No newline at end of file diff --git a/sortMergeList/sortMergeList/text.txt b/sortMergeList/sortMergeList/text.txt new file mode 100644 index 0000000..203e163 --- /dev/null +++ b/sortMergeList/sortMergeList/text.txt @@ -0,0 +1,4 @@ +Artem - 848848484 +Ilya - 53434343 +Danya - 34343434 +Dasha - 455252252 \ No newline at end of file From 64473df327225a60a7cfa44bf383715b1451e8af Mon Sep 17 00:00:00 2001 From: Artem Date: Sat, 29 Oct 2022 13:14:20 +0300 Subject: [PATCH 2/9] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=BC=D0=B0=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BD=D0=BE?= =?UTF-8?q?=20=D1=81=D0=BE=D1=80=D1=82=D0=B8=D1=80=D1=83=D0=B5=D1=82=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B0=D0=BC=20=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=BE=D0=BC=D0=B5=D1=80=D0=B0=D0=BC,=20=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BB=D0=BE=D1=81=D1=8C=20=D1=81=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20=D0=B8=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sortMergeList/sortMergeList/list.c | 92 ++++++++++++++++++++++++---- sortMergeList/sortMergeList/list.h | 6 +- sortMergeList/sortMergeList/main.c | 19 +++--- sortMergeList/sortMergeList/text.txt | 8 +-- 4 files changed, 96 insertions(+), 29 deletions(-) diff --git a/sortMergeList/sortMergeList/list.c b/sortMergeList/sortMergeList/list.c index 45c459e..eeabcea 100644 --- a/sortMergeList/sortMergeList/list.c +++ b/sortMergeList/sortMergeList/list.c @@ -16,13 +16,80 @@ bool isEmpty(List* list) { return list->head == NULL; } -void mergeSortByName(List* list, int size) { - +// , i, i , j, j +int isWhichBigger(List* list, int i, int j, int numberOrName) { + Node* walkerFirst = list->head; + int iWalker = 0; + while (iWalker < i && walkerFirst->next != NULL) { + ++iWalker; + walkerFirst = walkerFirst->next; + } + Node* walkerSecond = list->head; + int jWalker = 0; + while (jWalker < j && walkerSecond->next != NULL) { + ++jWalker; + walkerSecond = walkerSecond->next; + } + if (numberOrName == 0) { + return strcmp(walkerFirst->name, walkerSecond->name) > 0 ? i : j; + } else { + return strcmp(walkerFirst->number, walkerSecond->number) > 0 ? i : j; + } } -void mergeSortByNumber(List* list, int size) { +void toList(List* list, List* listCopy, int positionList, int positionListCopy, int numberOrName, int copyOrMain) { + Node* walkerCopy = listCopy->head; + int i = 0; + while (i < positionListCopy && walkerCopy->next != NULL) { + walkerCopy = walkerCopy->next; + ++i; + } + Node* walker = list->head; + int j = 0; + while (j < positionList && walker->next != NULL) { + walker = walker->next; + ++j; + } + if (copyOrMain == 0) { + strcpy(walkerCopy->name, walker->name); + strcpy(walkerCopy->number, walker->number); + } else { + strcpy(walker->name, walkerCopy->name); + strcpy(walker->number, walkerCopy->number); + } +} + +void mergeSort(int with, int to, List* list, List* listCopy, int numberOrName) { + if (to <= with) { + return; + } + + int middle = (with + to) / 2; + mergeSort(with, middle, list, listCopy, numberOrName); + mergeSort(middle + 1, to, list, listCopy, numberOrName); + + int i = with; + int j = middle + 1; + for (int l = with; l <= to; ++l) { + if (i == middle + 1) { + toList(list, listCopy, j, l, numberOrName, 0); + ++j; + } else if (j == to + 1) { + toList(list, listCopy, i, l, numberOrName, 0); + ++i; + } else if (isWhichBigger(list, i, j, numberOrName) == j) { + toList(list, listCopy, i, l, numberOrName, 0); + ++i; + } else { + toList(list, listCopy, j, l, numberOrName, 0); + ++j; + } + } + for (int k = with; k <= to; ++k) { + toList(list, listCopy, k, k, numberOrName, 1); + } } int addRecord(List* list, char name[], char number[]) { @@ -30,14 +97,15 @@ int addRecord(List* list, char name[], char number[]) { if (newNode == NULL) { return -1; } - size_t sizeName = strlen(name); - memset(newNode->name, 0, strlen(newNode->name)); - strncpy(newNode->name, name, sizeName); - - size_t sizeNumber = strlen(number); - memset(newNode->number, 0, strlen(newNode->number)); - strncpy(newNode->number, number, sizeNumber); + if (name != NULL && number != NULL) { + size_t sizeName = strlen(name); + memset(newNode->name, 0, strlen(newNode->name)); + strncpy(newNode->name, name, sizeName); + size_t sizeNumber = strlen(number); + memset(newNode->number, 0, strlen(newNode->number)); + strncpy(newNode->number, number, sizeNumber); + } newNode->next = NULL; if (list->head == NULL) { @@ -58,6 +126,7 @@ List* createList(void) { return list; } +/* bool isSortedByNumber(List* list) { if (list->head == NULL || list->head->next == NULL) { return true; @@ -82,4 +151,5 @@ bool isSortedByNumber(List* list) { walker = walker->next; } return true; -} \ No newline at end of file +} +*/ \ No newline at end of file diff --git a/sortMergeList/sortMergeList/list.h b/sortMergeList/sortMergeList/list.h index 7850d81..225e6f7 100644 --- a/sortMergeList/sortMergeList/list.h +++ b/sortMergeList/sortMergeList/list.h @@ -10,8 +10,4 @@ List* createList(void); int addRecord(List* list, char name[], char number[]); -void mergeSortByName(List* list, int size); - -void mergeSortByNumber(List* list, int size); - -bool isSortedByNumber(List* list); \ No newline at end of file +void mergeSort(int with, int to, List* list, List* listCopy, int numberOrName); \ No newline at end of file diff --git a/sortMergeList/sortMergeList/main.c b/sortMergeList/sortMergeList/main.c index 1e4884a..5b05fbd 100644 --- a/sortMergeList/sortMergeList/main.c +++ b/sortMergeList/sortMergeList/main.c @@ -7,8 +7,9 @@ int scanOne(); -bool readFromFile(char fileName[], int sortByNameOrNumber) { +bool readFromFile(char fileName[], int numberOrName) { List* list = createList(); + List* listCopy = createList(); FILE* file = fopen(fileName, "r"); if (file == NULL) { @@ -20,6 +21,7 @@ bool readFromFile(char fileName[], int sortByNameOrNumber) { char number[100] = { '\0' }; char buffer[100] = { '\0' }; int stringInfile = 0; + int size = 0; while (fscanf(file, "%s", buffer) == 1) { size_t sizeBuffer = strlen(buffer); size_t i = 0; @@ -35,22 +37,21 @@ bool readFromFile(char fileName[], int sortByNameOrNumber) { ++i; } addRecord(list, name, number); + addRecord(listCopy, NULL, NULL); memset(name, 0, strlen(name)); memset(number, 0, strlen(number)); stringInfile = -1; } ++stringInfile; + ++size; } + size /= 3; fclose(file); - if (sortByNameOrNumber == 0) { - mergeSortByNumber(list, 2); - } else if (sortByNameOrNumber == 1) { - mergeSortByName(list, 2); - } + mergeSort(0, size - 1, list, listCopy, numberOrName); - if (strcmp(fileName, "test.txt") == 0) { - return isSortedByNumber(list); - } + //if (strcmp(fileName, "test.txt") == 0) { + // return isSortedByNumber(list); + //} } bool test(void) { diff --git a/sortMergeList/sortMergeList/text.txt b/sortMergeList/sortMergeList/text.txt index 203e163..ed6e344 100644 --- a/sortMergeList/sortMergeList/text.txt +++ b/sortMergeList/sortMergeList/text.txt @@ -1,4 +1,4 @@ -Artem - 848848484 -Ilya - 53434343 -Danya - 34343434 -Dasha - 455252252 \ No newline at end of file +Artem - 12 +Ilya - 34 +Danya - 345 +Dasha - 127 \ No newline at end of file From 92db413009b75d99bf0798fbe60d5e661e6fb31a Mon Sep 17 00:00:00 2001 From: Artem Date: Sat, 29 Oct 2022 13:44:46 +0300 Subject: [PATCH 3/9] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=BF=D1=80=D0=B5=D0=B4=D1=83=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sortMergeList/sortMergeList/list.c | 61 +++++++++++++------ sortMergeList/sortMergeList/list.h | 8 ++- sortMergeList/sortMergeList/main.c | 35 ++++++++--- .../sortMergeList/sortMergeList.vcxproj | 2 +- .../sortMergeList.vcxproj.filters | 2 +- .../sortMergeList/{text.txt => test.txt} | 4 +- 6 files changed, 78 insertions(+), 34 deletions(-) rename sortMergeList/sortMergeList/{text.txt => test.txt} (50%) diff --git a/sortMergeList/sortMergeList/list.c b/sortMergeList/sortMergeList/list.c index eeabcea..48b8383 100644 --- a/sortMergeList/sortMergeList/list.c +++ b/sortMergeList/sortMergeList/list.c @@ -1,6 +1,8 @@ #include "list.h" #include #include +#include +#include typedef struct Node { char number[100]; @@ -110,7 +112,7 @@ int addRecord(List* list, char name[], char number[]) { if (list->head == NULL) { list->head = newNode; - return ; + return 0; } Node* walker = list->head; @@ -118,7 +120,7 @@ int addRecord(List* list, char name[], char number[]) { walker = walker->next; } walker->next = newNode; - + return 0; } List* createList(void) { @@ -126,30 +128,49 @@ List* createList(void) { return list; } -/* -bool isSortedByNumber(List* list) { +bool isSorted(List* list, int numberOrName) { if (list->head == NULL || list->head->next == NULL) { return true; } - Node* walker = list->head; - char number[100] = { '\0' }; - strncpy(number, walker->number, strlen(walker->number)); - walker = walker->next; + Node* walker = list->head->next; + int i = 1; while (walker->next != NULL) { - size_t sizeNumber = strlen(number); - size_t sizeListNumber = strlen(walker->number); - int i = 0; - while (i < sizeNumber && i < sizeListNumber) { - if (number[i] > walker->number[i]) { - return false; - } else if (number[i] < walker->number[i]) { - break; - } + if (isWhichBigger(list, i - 1, i, numberOrName) == i - 1) { + return false; } - memset(number, 0, strlen(number)); - strncpy(number, walker, strlen(walker->number)); walker = walker->next; + ++i; } return true; } -*/ \ No newline at end of file + +void printList(List* list) { + if (list->head == NULL) { + return ; + } + Node* walker = list->head; + while (walker != NULL) { + printf("%s - %s\n", walker->name, walker->number); + walker = walker->next; + } +} + +void clear(List* list) { + if (list->head == NULL) { + return; + } + Node* walker = list->head; + while (list->head != NULL) { + if (list->head->next == NULL) { + free(list->head); + free(list); + return; + } + walker = list->head; + while (walker->next->next != NULL) { + walker = walker->next; + } + free(walker->next); + walker->next = NULL; + } +} \ No newline at end of file diff --git a/sortMergeList/sortMergeList/list.h b/sortMergeList/sortMergeList/list.h index 225e6f7..05576e4 100644 --- a/sortMergeList/sortMergeList/list.h +++ b/sortMergeList/sortMergeList/list.h @@ -10,4 +10,10 @@ List* createList(void); int addRecord(List* list, char name[], char number[]); -void mergeSort(int with, int to, List* list, List* listCopy, int numberOrName); \ No newline at end of file +void mergeSort(int with, int to, List* list, List* listCopy, int numberOrName); + +bool isSorted(List* list, int numberOrName); + +void clear(List* list); + +void printList(List* list); \ No newline at end of file diff --git a/sortMergeList/sortMergeList/main.c b/sortMergeList/sortMergeList/main.c index 5b05fbd..90b9a74 100644 --- a/sortMergeList/sortMergeList/main.c +++ b/sortMergeList/sortMergeList/main.c @@ -13,7 +13,7 @@ bool readFromFile(char fileName[], int numberOrName) { FILE* file = fopen(fileName, "r"); if (file == NULL) { - printf("!"); + printf("! "); return false; } char letter = 0; @@ -36,8 +36,12 @@ bool readFromFile(char fileName[], int numberOrName) { number[i] = buffer[i]; ++i; } - addRecord(list, name, number); - addRecord(listCopy, NULL, NULL); + if (addRecord(list, name, number) != 0) { + return false; + } + if (addRecord(listCopy, NULL, NULL) != 0) { + return false; + } memset(name, 0, strlen(name)); memset(number, 0, strlen(number)); stringInfile = -1; @@ -45,13 +49,18 @@ bool readFromFile(char fileName[], int numberOrName) { ++stringInfile; ++size; } - size /= 3; fclose(file); + size /= 3; mergeSort(0, size - 1, list, listCopy, numberOrName); - //if (strcmp(fileName, "test.txt") == 0) { - // return isSortedByNumber(list); - //} + if (strcmp(fileName, "test.txt") == 0) { + return isSorted(list, numberOrName); + } + + printList(list); + clear(list); + clear(listCopy); + return true; } bool test(void) { @@ -60,6 +69,12 @@ bool test(void) { int main() { setlocale(LC_ALL, "RUS"); + if (test()) { + printf(" !\n"); + } else { + printf("...\n"); + return -1; + } char fileName[100] = { '\0' }; printf(" , ( : test.txt)\n"); int checkScan = scanf("%s", &fileName); @@ -67,12 +82,14 @@ int main() { while (strcmp(fileName, "test.txt") == 0 || checkScan != 1) { while (getchar() != '\n') { } - printf("\n"); + printf("... test.txt\n"); checkScan = scanf("%s", &fileName); } printf(" (0 - , 1 - )\n"); int sortByNameOrNumber = scanOne(); - readFromFile(fileName, sortByNameOrNumber); + if (!readFromFile(fileName, sortByNameOrNumber)) { + printf(" ...\n"); + } } int scanOne() { diff --git a/sortMergeList/sortMergeList/sortMergeList.vcxproj b/sortMergeList/sortMergeList/sortMergeList.vcxproj index baaaf87..9fd459a 100644 --- a/sortMergeList/sortMergeList/sortMergeList.vcxproj +++ b/sortMergeList/sortMergeList/sortMergeList.vcxproj @@ -146,7 +146,7 @@ - + diff --git a/sortMergeList/sortMergeList/sortMergeList.vcxproj.filters b/sortMergeList/sortMergeList/sortMergeList.vcxproj.filters index 3fff1a1..c33e1ad 100644 --- a/sortMergeList/sortMergeList/sortMergeList.vcxproj.filters +++ b/sortMergeList/sortMergeList/sortMergeList.vcxproj.filters @@ -28,7 +28,7 @@ - + Исходные файлы diff --git a/sortMergeList/sortMergeList/text.txt b/sortMergeList/sortMergeList/test.txt similarity index 50% rename from sortMergeList/sortMergeList/text.txt rename to sortMergeList/sortMergeList/test.txt index ed6e344..77282c8 100644 --- a/sortMergeList/sortMergeList/text.txt +++ b/sortMergeList/sortMergeList/test.txt @@ -1,4 +1,4 @@ -Artem - 12 -Ilya - 34 +Artem - 125 +Ilya - 343 Danya - 345 Dasha - 127 \ No newline at end of file From 285eccb0cedaef531d513d9495d6260740d8c2ff Mon Sep 17 00:00:00 2001 From: Artem Date: Sat, 29 Oct 2022 13:49:29 +0300 Subject: [PATCH 4/9] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BD=D0=B5=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B2?= =?UTF-8?q?=D0=B2=D0=BE=D0=B4=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sortMergeList/sortMergeList/main.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sortMergeList/sortMergeList/main.c b/sortMergeList/sortMergeList/main.c index 90b9a74..0f65623 100644 --- a/sortMergeList/sortMergeList/main.c +++ b/sortMergeList/sortMergeList/main.c @@ -71,7 +71,8 @@ int main() { setlocale(LC_ALL, "RUS"); if (test()) { printf(" !\n"); - } else { + } + else { printf("...\n"); return -1; } @@ -87,6 +88,10 @@ int main() { } printf(" (0 - , 1 - )\n"); int sortByNameOrNumber = scanOne(); + while (sortByNameOrNumber != 0 && sortByNameOrNumber != 1) { + printf(" ...\n"); + sortByNameOrNumber = scanOne(); + } if (!readFromFile(fileName, sortByNameOrNumber)) { printf(" ...\n"); } From 03c5b93ae09dc9cf8bcba2fc3bf61c7187ff3ff6 Mon Sep 17 00:00:00 2001 From: Palezehvat <114094069+Palezehvat@users.noreply.github.com> Date: Fri, 18 Nov 2022 14:51:05 +0300 Subject: [PATCH 5/9] Delete HomeworksAccept directory --- HomeworksAccept/homework21.09/read.me | 1 - HomeworksAccept/homework28.09/read.me | 1 - HomeworksAccept/read.me | 1 - 3 files changed, 3 deletions(-) delete mode 100644 HomeworksAccept/homework21.09/read.me delete mode 100644 HomeworksAccept/homework28.09/read.me delete mode 100644 HomeworksAccept/read.me diff --git a/HomeworksAccept/homework21.09/read.me b/HomeworksAccept/homework21.09/read.me deleted file mode 100644 index 5e4d090..0000000 --- a/HomeworksAccept/homework21.09/read.me +++ /dev/null @@ -1 +0,0 @@ -3 домашка diff --git a/HomeworksAccept/homework28.09/read.me b/HomeworksAccept/homework28.09/read.me deleted file mode 100644 index 5061ad0..0000000 --- a/HomeworksAccept/homework28.09/read.me +++ /dev/null @@ -1 +0,0 @@ -4 домашка diff --git a/HomeworksAccept/read.me b/HomeworksAccept/read.me deleted file mode 100644 index 1773bf8..0000000 --- a/HomeworksAccept/read.me +++ /dev/null @@ -1 +0,0 @@ -Здесь представлены домашнии работы, прошедшии проверку From e5e5b53e3335b016aee26048e0dc1234dd51587b Mon Sep 17 00:00:00 2001 From: Artem Date: Fri, 23 Dec 2022 12:09:53 +0300 Subject: [PATCH 6/9] =?UTF-8?q?=D0=A0=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sortMergeList/sortMergeList/list.c | 31 +++-- sortMergeList/sortMergeList/main.c | 180 +++++++++++++++-------------- 2 files changed, 112 insertions(+), 99 deletions(-) diff --git a/sortMergeList/sortMergeList/list.c b/sortMergeList/sortMergeList/list.c index 48b8383..8ffc650 100644 --- a/sortMergeList/sortMergeList/list.c +++ b/sortMergeList/sortMergeList/list.c @@ -34,7 +34,8 @@ int isWhichBigger(List* list, int i, int j, int numberOrName) { } if (numberOrName == 0) { return strcmp(walkerFirst->name, walkerSecond->name) > 0 ? i : j; - } else { + } + else { return strcmp(walkerFirst->number, walkerSecond->number) > 0 ? i : j; } } @@ -55,11 +56,12 @@ void toList(List* list, List* listCopy, int positionList, int positionListCopy, } if (copyOrMain == 0) { - strcpy(walkerCopy->name, walker->name); - strcpy(walkerCopy->number, walker->number); - } else { - strcpy(walker->name, walkerCopy->name); - strcpy(walker->number, walkerCopy->number); + strcpy(walkerCopy->name, walker->name); + strcpy(walkerCopy->number, walker->number); + } + else { + strcpy(walker->name, walkerCopy->name); + strcpy(walker->number, walkerCopy->number); } } @@ -67,7 +69,7 @@ void mergeSort(int with, int to, List* list, List* listCopy, int numberOrName) { if (to <= with) { return; } - + int middle = (with + to) / 2; mergeSort(with, middle, list, listCopy, numberOrName); mergeSort(middle + 1, to, list, listCopy, numberOrName); @@ -78,13 +80,16 @@ void mergeSort(int with, int to, List* list, List* listCopy, int numberOrName) { if (i == middle + 1) { toList(list, listCopy, j, l, numberOrName, 0); ++j; - } else if (j == to + 1) { + } + else if (j == to + 1) { toList(list, listCopy, i, l, numberOrName, 0); ++i; - } else if (isWhichBigger(list, i, j, numberOrName) == j) { + } + else if (isWhichBigger(list, i, j, numberOrName) == j) { toList(list, listCopy, i, l, numberOrName, 0); ++i; - } else { + } + else { toList(list, listCopy, j, l, numberOrName, 0); ++j; } @@ -119,6 +124,9 @@ int addRecord(List* list, char name[], char number[]) { while (walker->next != NULL) { walker = walker->next; } + + // !!! + walker->next = newNode; return 0; } @@ -146,7 +154,7 @@ bool isSorted(List* list, int numberOrName) { void printList(List* list) { if (list->head == NULL) { - return ; + return; } Node* walker = list->head; while (walker != NULL) { @@ -173,4 +181,5 @@ void clear(List* list) { free(walker->next); walker->next = NULL; } + // ! } \ No newline at end of file diff --git a/sortMergeList/sortMergeList/main.c b/sortMergeList/sortMergeList/main.c index 0f65623..b835a04 100644 --- a/sortMergeList/sortMergeList/main.c +++ b/sortMergeList/sortMergeList/main.c @@ -7,107 +7,111 @@ int scanOne(); -bool readFromFile(char fileName[], int numberOrName) { - List* list = createList(); - List* listCopy = createList(); - - FILE* file = fopen(fileName, "r"); - if (file == NULL) { - printf("! "); - return false; - } - char letter = 0; - char name[100] = { '\0' }; - char number[100] = { '\0' }; - char buffer[100] = { '\0' }; - int stringInfile = 0; - int size = 0; - while (fscanf(file, "%s", buffer) == 1) { - size_t sizeBuffer = strlen(buffer); - size_t i = 0; - if (stringInfile == 0) { - while (i < sizeBuffer) { - name[i] = buffer[i]; - ++i; - } - } - if (stringInfile == 2) { - while (i < sizeBuffer) { - number[i] = buffer[i]; - ++i; - } - if (addRecord(list, name, number) != 0) { - return false; - } - if (addRecord(listCopy, NULL, NULL) != 0) { - return false; - } - memset(name, 0, strlen(name)); - memset(number, 0, strlen(number)); - stringInfile = -1; - } - ++stringInfile; - ++size; - } - fclose(file); - size /= 3; - mergeSort(0, size - 1, list, listCopy, numberOrName); +bool readFromFileAndSort(const char* fileName, int numberOrName) { + FILE* file = fopen(fileName, "r"); + if (file == NULL) { + printf("! "); + return false; + } - if (strcmp(fileName, "test.txt") == 0) { - return isSorted(list, numberOrName); - } + List* list = createList(); + List* listCopy = createList(); - printList(list); - clear(list); - clear(listCopy); - return true; + char letter = 0; + char name[100] = { '\0' }; + char number[100] = { '\0' }; + char buffer[100] = { '\0' }; + int stringInfile = 0; + int size = 0; + while (fscanf(file, "%s", buffer) == 1) { + size_t sizeBuffer = strlen(buffer); + size_t i = 0; + if (stringInfile == 0) { + while (i < sizeBuffer) { + name[i] = buffer[i]; + ++i; + } + } + if (stringInfile == 2) { + while (i < sizeBuffer) { + number[i] = buffer[i]; + ++i; + } + if (addRecord(list, name, number) != 0) { + // + return false; + } + if (addRecord(listCopy, NULL, NULL) != 0) { + // + return false; + } + memset(name, 0, strlen(name)); + memset(number, 0, strlen(number)); + stringInfile = -1; + } + ++stringInfile; + ++size; + } + fclose(file); + size /= 3; + // + mergeSort(0, size - 1, list, listCopy, numberOrName); + + if (strcmp(fileName, "test.txt") == 0) { + return isSorted(list, numberOrName); + } + + printList(list); + clear(list); + clear(listCopy); + return true; } bool test(void) { - return readFromFile("test.txt", 1); + return readFromFileAndSort("test.txt", 1); } int main() { - setlocale(LC_ALL, "RUS"); - if (test()) { - printf(" !\n"); - } - else { - printf("...\n"); - return -1; - } - char fileName[100] = { '\0' }; - printf(" , ( : test.txt)\n"); - int checkScan = scanf("%s", &fileName); + setlocale(LC_ALL, "RUS"); + if (test()) { + printf(" !\n"); + } + else { + printf("...\n"); + return -1; + } + char fileName[100] = { '\0' }; + printf(" , ( : test.txt)\n"); + int checkScan = scanf("%s", &fileName); - while (strcmp(fileName, "test.txt") == 0 || checkScan != 1) { - while (getchar() != '\n') { - } - printf("... test.txt\n"); - checkScan = scanf("%s", &fileName); - } - printf(" (0 - , 1 - )\n"); - int sortByNameOrNumber = scanOne(); - while (sortByNameOrNumber != 0 && sortByNameOrNumber != 1) { - printf(" ...\n"); - sortByNameOrNumber = scanOne(); - } - if (!readFromFile(fileName, sortByNameOrNumber)) { - printf(" ...\n"); - } + while (strcmp(fileName, "test.txt") == 0 || checkScan != 1) { + while (getchar() != '\n') { + } + printf("... test.txt\n"); + checkScan = scanf("%s", &fileName); + } + printf(" (0 - , 1 - )\n"); + int sortByNameOrNumber = scanOne(); + while (sortByNameOrNumber != 0 && sortByNameOrNumber != 1) { + printf(" ...\n"); + sortByNameOrNumber = scanOne(); + } + if (!readFromFileAndSort(fileName, sortByNameOrNumber)) { + printf(" ...\n"); + } } int scanOne() { - int number = 0; - int checkScanf = scanf("%d", &number); + int number = 0; + int checkScanf = scanf("%d", &number); - while (checkScanf != 1) { - while (getchar() != '\n') { - } + while (checkScanf != 1) { + while (getchar() != '\n') { + } - printf("...\n"); - checkScanf = scanf("%d", &number); - } + printf("...\n"); + checkScanf = scanf("%d", &number); + } - return number; + return number; } \ No newline at end of file From 64c40ae00df57284a8f7f68583c2dd9372104511 Mon Sep 17 00:00:00 2001 From: Artem Date: Fri, 23 Dec 2022 15:28:15 +0300 Subject: [PATCH 7/9] =?UTF-8?q?=D0=A0=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sortMergeList/sortMergeList/list.c | 44 ++++++++++++++++++------------ sortMergeList/sortMergeList/list.h | 4 +-- sortMergeList/sortMergeList/main.c | 12 ++------ 3 files changed, 31 insertions(+), 29 deletions(-) diff --git a/sortMergeList/sortMergeList/list.c b/sortMergeList/sortMergeList/list.c index 8ffc650..67e28df 100644 --- a/sortMergeList/sortMergeList/list.c +++ b/sortMergeList/sortMergeList/list.c @@ -12,6 +12,7 @@ typedef struct Node { struct List { Node* head; + Node* tail; }; bool isEmpty(List* list) { @@ -65,14 +66,14 @@ void toList(List* list, List* listCopy, int positionList, int positionListCopy, } } -void mergeSort(int with, int to, List* list, List* listCopy, int numberOrName) { +void mergeSortOriginal(int with, int to, List* list, List* listCopy, int numberOrName) { if (to <= with) { return; } int middle = (with + to) / 2; - mergeSort(with, middle, list, listCopy, numberOrName); - mergeSort(middle + 1, to, list, listCopy, numberOrName); + mergeSortOriginal (with, middle, list, listCopy, numberOrName); + mergeSortOriginal (middle + 1, to, list, listCopy, numberOrName); int i = with; int j = middle + 1; @@ -99,9 +100,20 @@ void mergeSort(int with, int to, List* list, List* listCopy, int numberOrName) { } } +void mergeSort(int size, List* list, int numberOrName) { + int i = 0; + List* listCopy = createList(); + while (i < size) { + addRecord(listCopy, NULL, NULL); + ++i; + } + mergeSortOriginal(0, size - 1, list, listCopy, numberOrName); +} + int addRecord(List* list, char name[], char number[]) { Node* newNode = calloc(1, sizeof(Node)); if (newNode == NULL) { + clear(&list); return -1; } if (name != NULL && number != NULL) { @@ -117,17 +129,13 @@ int addRecord(List* list, char name[], char number[]) { if (list->head == NULL) { list->head = newNode; + list->tail = newNode; return 0; } - Node* walker = list->head; - while (walker->next != NULL) { - walker = walker->next; - } - - // !!! + list->tail->next = newNode; - walker->next = newNode; + list->tail = newNode; return 0; } @@ -163,23 +171,23 @@ void printList(List* list) { } } -void clear(List* list) { - if (list->head == NULL) { +void clear(List** list) { + if ((*list)->head == NULL) { return; } - Node* walker = list->head; - while (list->head != NULL) { - if (list->head->next == NULL) { - free(list->head); + Node* walker = (*list)->head; + while ((*list)->head != NULL) { + if ((*list)->head->next == NULL) { + free((*list)->head); free(list); return; } - walker = list->head; + walker = (*list)->head; while (walker->next->next != NULL) { walker = walker->next; } free(walker->next); walker->next = NULL; } - // ! + free(*list); } \ No newline at end of file diff --git a/sortMergeList/sortMergeList/list.h b/sortMergeList/sortMergeList/list.h index 05576e4..eb49489 100644 --- a/sortMergeList/sortMergeList/list.h +++ b/sortMergeList/sortMergeList/list.h @@ -10,10 +10,10 @@ List* createList(void); int addRecord(List* list, char name[], char number[]); -void mergeSort(int with, int to, List* list, List* listCopy, int numberOrName); +void mergeSort(int size, List* list, int numberOrName); bool isSorted(List* list, int numberOrName); -void clear(List* list); +void clear(List** list); void printList(List* list); \ No newline at end of file diff --git a/sortMergeList/sortMergeList/main.c b/sortMergeList/sortMergeList/main.c index b835a04..ec89cde 100644 --- a/sortMergeList/sortMergeList/main.c +++ b/sortMergeList/sortMergeList/main.c @@ -15,7 +15,6 @@ bool readFromFileAndSort(const char* fileName, int numberOrName) { } List* list = createList(); - List* listCopy = createList(); char letter = 0; char name[100] = { '\0' }; @@ -38,11 +37,7 @@ bool readFromFileAndSort(const char* fileName, int numberOrName) { ++i; } if (addRecord(list, name, number) != 0) { - // - return false; - } - if (addRecord(listCopy, NULL, NULL) != 0) { - // + clear(&list); return false; } memset(name, 0, strlen(name)); @@ -54,8 +49,8 @@ bool readFromFileAndSort(const char* fileName, int numberOrName) { } fclose(file); size /= 3; - // - mergeSort(0, size - 1, list, listCopy, numberOrName); + + mergeSort(size, list, numberOrName); if (strcmp(fileName, "test.txt") == 0) { return isSorted(list, numberOrName); @@ -63,7 +58,6 @@ bool readFromFileAndSort(const char* fileName, int numberOrName) { printList(list); clear(list); - clear(listCopy); return true; } From e342f1ee235a99e7c0a226de84b41e52ba44d5b7 Mon Sep 17 00:00:00 2001 From: Artem Date: Fri, 23 Dec 2022 16:20:04 +0300 Subject: [PATCH 8/9] =?UTF-8?q?=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sortMergeList/sortMergeList/list.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sortMergeList/sortMergeList/list.h b/sortMergeList/sortMergeList/list.h index eb49489..8e0f44d 100644 --- a/sortMergeList/sortMergeList/list.h +++ b/sortMergeList/sortMergeList/list.h @@ -4,16 +4,23 @@ typedef struct List List; +// . bool isEmpty(List* list); +// list'. List* createList(void); +// . int addRecord(List* list, char name[], char number[]); +// . void mergeSort(int size, List* list, int numberOrName); +// . bool isSorted(List* list, int numberOrName); +// list' void clear(List** list); +// list' void printList(List* list); \ No newline at end of file From 7f95df488849a5d711f0f6996cc77cd61a21f72e Mon Sep 17 00:00:00 2001 From: Artem Date: Fri, 23 Dec 2022 17:19:58 +0300 Subject: [PATCH 9/9] =?UTF-8?q?=D0=A0=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sortMergeList/sortMergeList/list.c | 111 +++++++++++------------------ 1 file changed, 41 insertions(+), 70 deletions(-) diff --git a/sortMergeList/sortMergeList/list.c b/sortMergeList/sortMergeList/list.c index 67e28df..177260a 100644 --- a/sortMergeList/sortMergeList/list.c +++ b/sortMergeList/sortMergeList/list.c @@ -8,6 +8,7 @@ typedef struct Node { char number[100]; char name[100]; struct Node* next; + struct Node* prev; } Node; struct List { @@ -20,82 +21,82 @@ bool isEmpty(List* list) { } // , i, i , j, j -int isWhichBigger(List* list, int i, int j, int numberOrName) { +int isWhichBigger(List* list, Node* i, Node* j, int numberOrName) { Node* walkerFirst = list->head; int iWalker = 0; - while (iWalker < i && walkerFirst->next != NULL) { + while (iWalker < i&& walkerFirst->next != NULL) { ++iWalker; walkerFirst = walkerFirst->next; } Node* walkerSecond = list->head; int jWalker = 0; - while (jWalker < j && walkerSecond->next != NULL) { + while (jWalker < j&& walkerSecond->next != NULL) { ++jWalker; walkerSecond = walkerSecond->next; } if (numberOrName == 0) { - return strcmp(walkerFirst->name, walkerSecond->name) > 0 ? i : j; + return strcmp(i->name, j->name) > 0 ? i : j; } else { - return strcmp(walkerFirst->number, walkerSecond->number) > 0 ? i : j; + return strcmp(i->number, j->number) > 0 ? i : j; } } -void toList(List* list, List* listCopy, int positionList, int positionListCopy, int numberOrName, int copyOrMain) { - Node* walkerCopy = listCopy->head; - int i = 0; - while (i < positionListCopy && walkerCopy->next != NULL) { - walkerCopy = walkerCopy->next; - ++i; - } - - Node* walker = list->head; - int j = 0; - while (j < positionList && walker->next != NULL) { - walker = walker->next; - ++j; - } - +void toList(List* list, List* listCopy, Node* positionList, Node* positionListCopy, int numberOrName, int copyOrMain) { if (copyOrMain == 0) { - strcpy(walkerCopy->name, walker->name); - strcpy(walkerCopy->number, walker->number); + strcpy(positionListCopy->name, positionList->name); + strcpy(positionListCopy->number, positionList->number); } else { - strcpy(walker->name, walkerCopy->name); - strcpy(walker->number, walkerCopy->number); + strcpy(positionList->name, positionListCopy->name); + strcpy(positionList->number, positionListCopy->number); } } -void mergeSortOriginal(int with, int to, List* list, List* listCopy, int numberOrName) { +Node* findMiddle(Node* with, Node* to) { + Node* walkerWith = with; + Node* walkerTo = to; + while (walkerWith != walkerTo || walkerWith->next != walkerTo) { + walkerWith = walkerWith->next; + walkerTo = walkerTo->prev; + } + return walkerWith; +} + +void mergeSortOriginal(Node* with, Node* to, List* list, List* listCopy, int numberOrName) { if (to <= with) { return; } - int middle = (with + to) / 2; - mergeSortOriginal (with, middle, list, listCopy, numberOrName); - mergeSortOriginal (middle + 1, to, list, listCopy, numberOrName); + Node* middle = findMiddle(with, to); + + mergeSortOriginal(with, middle, list, listCopy, numberOrName); + mergeSortOriginal(middle + 1, to, list, listCopy, numberOrName); - int i = with; - int j = middle + 1; - for (int l = with; l <= to; ++l) { + Node* i = with; + Node* j = middle + 1; + Node* l = with; + while (i != j) { if (i == middle + 1) { toList(list, listCopy, j, l, numberOrName, 0); - ++j; + j = j->next; } else if (j == to + 1) { toList(list, listCopy, i, l, numberOrName, 0); - ++i; + i = i->next; } else if (isWhichBigger(list, i, j, numberOrName) == j) { toList(list, listCopy, i, l, numberOrName, 0); - ++i; + i = i->next; } else { toList(list, listCopy, j, l, numberOrName, 0); - ++j; + j = j->next; } + l = l->next; } - for (int k = with; k <= to; ++k) { + Node* k = with; + while (k <= to) { toList(list, listCopy, k, k, numberOrName, 1); } } @@ -107,7 +108,7 @@ void mergeSort(int size, List* list, int numberOrName) { addRecord(listCopy, NULL, NULL); ++i; } - mergeSortOriginal(0, size - 1, list, listCopy, numberOrName); + mergeSortOriginal(list->head, list->tail, list, listCopy, numberOrName); } int addRecord(List* list, char name[], char number[]) { @@ -128,14 +129,16 @@ int addRecord(List* list, char name[], char number[]) { newNode->next = NULL; if (list->head == NULL) { + newNode->prev = list->tail; list->head = newNode; list->tail = newNode; return 0; } list->tail->next = newNode; - + newNode->prev = list->tail; list->tail = newNode; + return 0; } @@ -158,36 +161,4 @@ bool isSorted(List* list, int numberOrName) { ++i; } return true; -} - -void printList(List* list) { - if (list->head == NULL) { - return; - } - Node* walker = list->head; - while (walker != NULL) { - printf("%s - %s\n", walker->name, walker->number); - walker = walker->next; - } -} - -void clear(List** list) { - if ((*list)->head == NULL) { - return; - } - Node* walker = (*list)->head; - while ((*list)->head != NULL) { - if ((*list)->head->next == NULL) { - free((*list)->head); - free(list); - return; - } - walker = (*list)->head; - while (walker->next->next != NULL) { - walker = walker->next; - } - free(walker->next); - walker->next = NULL; - } - free(*list); } \ No newline at end of file