#include "Header.h" /// /// То, как выглядит элемент списка /// struct ElementList { int value; struct ElementList* nextElement; }; typedef struct ElementList ElementList; //определение имени структуры typedef ElementList* List; //определение имени типа листа (головы списка) /// /// Генерация линейного односвязного списка. /// /// Кол-во элемента списка. /// Голова линейного односвязного списка. List createIntList(int length) { if (!length) return 1; List headOfList = calloc(1, sizeof(ElementList)); headOfList->value = 1; headOfList->nextElement = NULL; List currentElement = headOfList, newElement; for (int i = 2; i <= length; i++) { newElement = calloc(1, sizeof(ElementList)); newElement->value = i; currentElement->nextElement = newElement; currentElement = newElement; } currentElement->nextElement = NULL; return headOfList; } /// /// Удаление линейного односвязного списка. /// /// Голова линейного односвязного списка. void deleteIntList(List list) { while (list) { List nextList = list->nextElement; free(list); list = nextList; } free(list); } /// /// Вывод линейного односвязного списка на консоль. /// /// Голова линейного односвязного списка. void printIntList(List list) { while (list) { printf("%d ", list->value); list = list->nextElement; } printf("\n"); } /// /// Добавление эелемента в линейный односвязный список. /// /// Голова линейного односвязного списка. /// Позиция для вставки. /// Вставляемый элемент. /// Голова измененного линейного односвязного списка. List insertIntElementInList(List list, int numberElemnt, List insertedElement) { List headOfList = list; if (numberElemnt > 1) { for (int i = 1; i < numberElemnt - 1; i++) { list = list->nextElement; } insertedElement->nextElement = list->nextElement; list->nextElement = insertedElement; } else if (numberElemnt == 1) { insertedElement->nextElement = list; headOfList = insertedElement; } return headOfList; } /// /// Удаление элемента линейного односвязнного списка. /// /// Голова линейного односвязного списка. /// Порядковый номер удаляемого элемента. /// Голова измененного линейного односвязного списка. List deletIntElementInList(List list, int numberElemnt) { List headOfList = list; if (numberElemnt > 1) { for (int i = 1; i < numberElemnt - 1; i++) { list = list->nextElement; } list->nextElement = list->nextElement->nextElement; } else if (numberElemnt == 1) { headOfList = list->nextElement; free(list); } return headOfList; } /// /// Смена элементов линейного односвязнного списка местами. /// /// Голова линейного односвязного списка. /// Номер первого элемента. /// Номер второго элемента. /// Голова измененного линейного односвязного списка. List swapElementIntList(List list, int numberFirstElement, int numberSecondElement) { List headOfList = list; //если указаны одинаковые номера if (numberFirstElement == numberSecondElement) { return headOfList; } //смена номеров местами, если первым указан больший if (numberFirstElement > numberSecondElement) { int temp = numberFirstElement; numberFirstElement = numberSecondElement; numberSecondElement = temp; } //если нужно поменять голову списка if (numberFirstElement == 1) { for (int i = 1; i < numberSecondElement - 1; i++) { list = list->nextElement; } List currentElement = list->nextElement; List nextAfterCurrentElement = currentElement->nextElement; currentElement->nextElement = headOfList->nextElement; list->nextElement = headOfList; headOfList->nextElement = nextAfterCurrentElement; return currentElement; } //иные случаи swap'а else { for (int i = 1; i < numberFirstElement - 1; i++) { list = list->nextElement; } List prefFirstCurrentElement = list; //Элемент перед первым целевым элементом for (int i = numberFirstElement - 1; i < numberSecondElement - 1; i++) { list = list->nextElement; } List prefSecondCurrentElement = list; //Элемент перед вторым целевым элементом List nextFirstCurrentElemnt = prefFirstCurrentElement->nextElement->nextElement; //Сохранение адреса-ссылки первого элемента для обмена prefFirstCurrentElement->nextElement->nextElement = prefSecondCurrentElement->nextElement->nextElement; prefSecondCurrentElement->nextElement->nextElement = nextFirstCurrentElemnt; List firstCurrentElemnt = prefFirstCurrentElement->nextElement; //Сохранение адреса-ссылки второго элемента для обмена prefFirstCurrentElement->nextElement = prefSecondCurrentElement->nextElement; prefSecondCurrentElement->nextElement = firstCurrentElemnt; return headOfList; } } int startWorkWithLinelist() { //Создание листа List MyList = createIntList(10); printIntList(MyList); //Добавление элемента List newElemnt = calloc(1, sizeof(ElementList)); newElemnt->value = 99; MyList = insertIntElementInList(MyList, 1, newElemnt); printIntList(MyList); //Удаление эдемента MyList = deletIntElementInList(MyList, 1); printIntList(MyList); //Поменять элементы местами MyList = swapElementIntList(MyList, 10, 1); printIntList(MyList); //Удаление списка deleteIntList(MyList); return 0; }