Для переделки статического списка в динамический список в языке программирования C, нужно выполнить следующие шаги:
1. Объявить и определить новую структуру для элемента списка, которая будет содержать данные элемента и указатель на следующий элемент списка. Например:
typedef struct Node { int data; struct Node* next; } Node;
2. Создать глобальную переменную, которая будет указывать на голову списка:
Node* head = NULL;
3. Реализовать функцию для добавления нового элемента в список. В этой функции нужно выделить память для нового элемента, присвоить его данным нужные значения и настроить указатели для включения нового элемента в список. Если список был пустой, то новый элемент становится головой списка. В противном случае, если список не пустой, нужно пройти по всем элементам списка до последнего элемента и установить указатель последнего элемента на новый элемент:
void addNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; if (head == NULL) { head = newNode; } else { Node* current = head; while (current->next != NULL) { current = current->next; } current->next = newNode; } }
4. Добавить функцию для удаления элемента из списка. В этой функции нужно найти элемент, который нужно удалить, настроить указатели предыдущего и следующего элементов, чтобы они обходили удаляемый элемент, а затем освободить память, занимаемую этим элементом:
void deleteNode(int data) { if (head == NULL) { return; } if (head->data == data) { Node* temp = head; head = head->next; free(temp); } else { Node* current = head; Node* previous = NULL; while (current != NULL && current->data != data) { previous = current; current = current->next; } if (current == NULL) { return; } previous->next = current->next; free(current); } }
5. Добавить функцию для печати всех элементов списка:
void printList() { Node* current = head; while (current != NULL) { printf("%d ", current->data); current = current->next; } printf("n"); }
6. Наконец, напишите функцию main(), чтобы продемонстрировать использование списка:
int main() { addNode(1); addNode(2); addNode(3); printList(); // должно вывести "1 2 3" deleteNode(2); printList(); // должно вывести "1 3" return 0; }
В результате выполнения данных шагов будет получен динамический список, который позволяет добавлять, удалять и печатать элементы в нем.