Учебная версия на русском. Код и его вывод сохранены в исходном виде.
Односвязный список на 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
Частые вопросы
Почему код и вывод остаются на английском?
Ключевые слова, идентификаторы и строки, проверяемые тестами, сохранены, чтобы не менять программу. Объяснения и элементы управления переведены.