Как переделать под динамический список?

Для переделки статического списка в динамический список в языке программирования 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;
}

В результате выполнения данных шагов будет получен динамический список, который позволяет добавлять, удалять и печатать элементы в нем.