Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion HomeworksAccept/homework21.09/read.me

This file was deleted.

1 change: 0 additions & 1 deletion HomeworksAccept/homework28.09/read.me

This file was deleted.

1 change: 0 additions & 1 deletion HomeworksAccept/read.me

This file was deleted.

31 changes: 31 additions & 0 deletions sortMergeList/sortMergeList.sln
Original file line number Diff line number Diff line change
@@ -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
164 changes: 164 additions & 0 deletions sortMergeList/sortMergeList/list.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
#include "list.h"
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

typedef struct Node {
char number[100];
char name[100];
struct Node* next;
struct Node* prev;
} Node;

struct List {
Node* head;
Node* tail;
};

bool isEmpty(List* list) {
return list->head == NULL;
}

//������� �� �������� ��� ��������, ���������� �������� i, ���� ������� � �������� i ������, ��� ������� � �������� j, ���������� �������� j � ������ ������
int isWhichBigger(List* list, Node* i, Node* 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(i->name, j->name) > 0 ? i : j;
}
else {
return strcmp(i->number, j->number) > 0 ? i : j;
}
}

void toList(List* list, List* listCopy, Node* positionList, Node* positionListCopy, int numberOrName, int copyOrMain) {
if (copyOrMain == 0) {
strcpy(positionListCopy->name, positionList->name);
strcpy(positionListCopy->number, positionList->number);
}
else {
strcpy(positionList->name, positionListCopy->name);
strcpy(positionList->number, positionListCopy->number);
}
}

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;
}

Node* middle = findMiddle(with, to);

mergeSortOriginal(with, middle, list, listCopy, numberOrName);
mergeSortOriginal(middle + 1, to, list, listCopy, numberOrName);

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->next;
}
else if (j == to + 1) {
toList(list, listCopy, i, l, numberOrName, 0);
i = i->next;
}
else if (isWhichBigger(list, i, j, numberOrName) == j) {
toList(list, listCopy, i, l, numberOrName, 0);
i = i->next;
}
else {
toList(list, listCopy, j, l, numberOrName, 0);
j = j->next;
}
l = l->next;
}
Node* k = with;
while (k <= to) {
toList(list, listCopy, k, k, numberOrName, 1);
}
}

void mergeSort(int size, List* list, int numberOrName) {
int i = 0;
List* listCopy = createList();
while (i < size) {
addRecord(listCopy, NULL, NULL);
++i;
}
mergeSortOriginal(list->head, list->tail, 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) {
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) {
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;
}

List* createList(void) {
List* list = calloc(1, sizeof(List));
return list;
}

bool isSorted(List* list, int numberOrName) {
if (list->head == NULL || list->head->next == NULL) {
return true;
}
Node* walker = list->head->next;
int i = 1;
while (walker->next != NULL) {
if (isWhichBigger(list, i - 1, i, numberOrName) == i - 1) {
return false;
}
walker = walker->next;
++i;
}
return true;
}
26 changes: 26 additions & 0 deletions sortMergeList/sortMergeList/list.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#pragma once
#include <stdbool.h>
#include <stdlib.h>

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);
111 changes: 111 additions & 0 deletions sortMergeList/sortMergeList/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <stdbool.h>
#include <string.h>
#include "list.h"

int scanOne();

bool readFromFileAndSort(const char* fileName, int numberOrName) {
FILE* file = fopen(fileName, "r");
if (file == NULL) {
printf("������! ");
return false;
}

List* list = createList();

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) {
clear(&list);
return false;
}
memset(name, 0, strlen(name));
memset(number, 0, strlen(number));
stringInfile = -1;
}
++stringInfile;
++size;
}
fclose(file);
size /= 3;

mergeSort(size, list, numberOrName);

if (strcmp(fileName, "test.txt") == 0) {
return isSorted(list, numberOrName);
}

printList(list);
clear(list);
return true;
}

bool test(void) {
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);

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);

while (checkScanf != 1) {
while (getchar() != '\n') {
}

printf("������...\n");
checkScanf = scanf("%d", &number);
}

return number;
}
Loading