Online C Compiler
Открыть в компиляторе

Учебная версия на русском. Код и его вывод сохранены в исходном виде.

Односвязный список на C

Создавайте, обходите и освобождайте узлы, связанные указателями.

Открыть в компиляторе

Односвязный список на C
Создавайте, обходите и освобождайте узлы, связанные указателями.

Узел хранит значение и указатель на следующий узел. head указывает на начало, NULL обозначает конец или пустой список. В отличие от массива, узлы не обязаны располагаться по соседним адресам.

Проверяйте malloc перед записью. При вставке или удалении сохраняйте связь с остатком списка и обновляйте head, если меняется первый узел. Поиск значения требует обхода и занимает O(N).

Для освобождения сначала сохраните указатель на следующий узел, затем вызывайте free для текущего. Проверьте пустой список, один узел и несколько узлов. После free нельзя читать поля освобождённого узла.

Код C

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

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

Node* insertHead(Node *head, int val) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->data = val;
    newNode->next = head;
    return newNode;
}

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

void freeList(Node *head) {
    Node *curr = head;
    while (curr != NULL) {
        Node *temp = curr;
        curr = curr->next;
        free(temp);
    }
}

int main() {
    Node *head = NULL;
    head = insertHead(head, 30);
    head = insertHead(head, 20);
    head = insertHead(head, 10);

    printf("Linked List: ");
    printList(head);

    freeList(head);
    return 0;
}
Открыть в компиляторе

Ожидаемый вывод

Linked List: 10 -> 20 -> 30 -> NULL

Частые вопросы

Почему код и вывод остаются на английском?

Ключевые слова, идентификаторы и строки, проверяемые тестами, сохранены, чтобы не менять программу. Объяснения и элементы управления переведены.