Как копировать список в си (C)?

В C нет встроенного типа данных "список", но можно создать свою реализацию списка с помощью указателей и динамического выделения памяти. Для того чтобы скопировать список в C, нужно перебрать все элементы и создать новую копию каждого элемента.

Вот пример функции, которая копирует список:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node* next;
} Node;

Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

Node* copyList(Node* head) {
    if (head == NULL) {
        return NULL;
    }
    
    Node* newHead = createNode(head->data);
    Node* current = newHead;
    Node* oldCurrent = head->next;
    
    while (oldCurrent != NULL) {
        current->next = createNode(oldCurrent->data);
        current = current->next;
        oldCurrent = oldCurrent->next;
    }
    
    return newHead;
}

void printList(Node* head) {
    Node* current = head;
    
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }
}

int main() {
    // Создание исходного списка
    Node* head = createNode(1);
    Node* second = createNode(2);
    Node* third = createNode(3);
    
    head->next = second;
    second->next = third;
    
    // Копирование списка
    Node* newHead = copyList(head);
    
    // Вывод исходного списка
    printf("Исходный список: ");
    printList(head);
    
    // Вывод скопированного списка
    printf("nСкопированный список: ");
    printList(newHead);
    
    return 0;
}

В этом примере мы создаем функцию copyList, которая принимает голову исходного списка и возвращает голову копии списка. Мы создаем новую голову исходной копии, а затем перебираем все элементы исходного списка, каждый раз создавая новый узел для копии и связывая его с предыдущим узлом в копии.

Затем мы используем функцию printList, чтобы вывести исходный список и скопированный список на экран.

Вывод программы будет следующим:

Исходный список: 1 2 3 
Скопированный список: 1 2 3

Таким образом, мы успешно скопировали список в C.