Реализация двусвязного списка с элементами конкретного типа?

Для реализации двусвязного списка с элементами конкретного типа в языке программирования 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. При необходимости, можно адаптировать данный код для работы с элементами конкретного типа, добавляя соответствующие поля и функции для работы с ними.