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