Для реализации двусвязного списка с элементами конкретного типа в языке программирования C, необходимо создать структуру, которая будет представлять узел списка. Каждый узел будет содержать два указателя - на предыдущий и следующий узлы в списке, а также поле для хранения значения элемента.
Вот пример кода, демонстрирующий реализацию двусвязного списка с элементами типа int:
#include <stdio.h> #include <stdlib.h> // Структура для узла списка struct Node { int data; struct Node* prev; struct Node* next; }; // Функция для создания нового узла struct Node* createNode(int value) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = value; newNode->prev = NULL; newNode->next = NULL; return newNode; } // Функция для добавления нового узла в начало списка void addNode(struct Node** head, int value) { struct Node* newNode = createNode(value); if (*head == NULL) { // Если список пустой, то созданный узел становится головным *head = newNode; } else { // Если список не пустой, то новый узел становится головным, // а предыдущий головной узел становится следующим для нового узла (*head)->prev = newNode; newNode->next = *head; *head = newNode; } } // Функция для удаления узла из списка void deleteNode(struct Node** head, struct Node* delNode) { if (*head == NULL || delNode == NULL) return; // Если удаляемый узел является головным, то новой головой становится // следующий узел в списке if (*head == delNode) *head = delNode->next; // Если удаляемый узел имеет следующий узел, то он становится предыдущим // для следующего узла if (delNode->next != NULL) delNode->next->prev = delNode->prev; // Если удаляемый узел имеет предыдущий узел, то он становится следующим // для предыдущего узла if (delNode->prev != NULL) delNode->prev->next = delNode->next; // Освобождаем память, занимаемую удаляемым узлом free(delNode); } // Функция для вывода элементов списка void printList(struct Node* head) { struct Node* temp = head; while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } printf("n"); } // Тестирование реализации двусвязного списка int main() { struct Node* myList = NULL; addNode(&myList, 3); addNode(&myList, 7); addNode(&myList, 10); printf("Список: "); printList(myList); deleteNode(&myList, myList); // Удаляем головной узел printf("Список после удаления головного узла: "); printList(myList); return 0; }
В данном примере используется структура "Node", представляющая узел списка, с полями "data" для хранения значения элемента, "prev" - указатель на предыдущий узел, и "next" - указатель на следующий узел.
Также, в коде приведены функции "createNode" для создания нового узла, "addNode" для добавления нового узла в начало списка, "deleteNode" для удаления узла из списка, и "printList" для вывода элементов списка. Функции надо вызывать соответствующим образом для добавления, удаления и вывода элементов списка.
В функции "main" приведен пример использования реализованного двусвязного списка. Сначала создаются несколько узлов с помощью функции "addNode". Затем выводится содержимое списка с помощью функции "printList". Далее удаляется головной узел с помощью функции "deleteNode", и снова выводится содержимое списка. Результат выполнения программы будет следующим:
Список: 10 7 3 Список после удаления головного узла: 7 3
Таким образом, данный код реализует двусвязный список с элементами типа int в языке программирования C. При необходимости, можно адаптировать данный код для работы с элементами конкретного типа, добавляя соответствующие поля и функции для работы с ними.