Для реализации списка на языке программирования C можно использовать структуру данных "связный список" (linked list). Связный список представляет собой коллекцию узлов, каждый из которых содержит данные и указатель на следующий узел. Первый узел списка называется головой (head), а последний узел - хвостом (tail).
Опишем структуру узла (Node) с использованием typedef в C:
typedef struct Node { int data; // данные, которые содержит узел struct Node* next; // указатель на следующий узел списка } Node;
Далее создадим структуру списка (LinkedList) с указателями на голову и хвост:
typedef struct LinkedList { Node* head; // указатель на голову списка Node* tail; // указатель на хвост списка } LinkedList;
Теперь можно реализовать некоторые основные операции с списком:
1. Создание пустого списка:
LinkedList* createLinkedList() { LinkedList* list = (LinkedList*)malloc(sizeof(LinkedList)); list->head = NULL; list->tail = NULL; return list; }
2. Добавление нового узла в конец списка:
void append(LinkedList* list, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; if(list->head == NULL) { // если список пустой list->head = newNode; list->tail = newNode; } else { list->tail->next = newNode; list->tail = newNode; } }
3. Вставка нового узла после определенного узла:
void insertAfter(Node* node, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = node->next; node->next = newNode; }
4. Удаление узла из списка:
void removeNode(LinkedList* list, Node* node) { if(node == list->head) { // если удаляемый узел - голова списка list->head = list->head->next; } else { Node* prev = list->head; while(prev->next != node) { // находим предыдущий узел prev = prev->next; } prev->next = node->next; // удаляем связь с удаляемым узлом } free(node); // освобождаем память }
5. Поиск узла с определенными данными:
Node* search(LinkedList* list, int data) { Node* current = list->head; while(current != NULL) { if(current->data == data) return current; current = current->next; } return NULL; // если узел не найден }
6. Удаление всего списка:
void deleteLinkedList(LinkedList* list) { Node* current = list->head; Node* next; while(current != NULL) { next = current->next; free(current); current = next; } free(list); }
Пример использования:
int main() { LinkedList* list = createLinkedList(); append(list, 1); append(list, 2); append(list, 3); Node* node = search(list, 2); insertAfter(node, 4); removeNode(list, node); deleteLinkedList(list); return 0; }
Таким образом, реализация списка на C с использованием связных узлов позволяет гибко добавлять, удалять и искать элементы списка, что делает эту структуру данных очень полезной при разработке программ на языке C.