c语言双向链表是如何实现的

avatar
作者
猴君
阅读量:0

在C语言中,双向链表可以通过结构体和指针来实现。一个典型的双向链表节点结构体可以定义如下:

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

在双向链表中,每个节点包含一个数据域和两个指针域,分别指向前一个节点和后一个节点。接下来可以定义一个双向链表结构体来保存链表的头节点和尾节点:

typedef struct {     Node* head;     Node* tail; } DoublyLinkedList; 

实现双向链表的基本操作,包括初始化、插入节点、删除节点等操作。以下是一个简单的双向链表的实现示例:

#include <stdio.h> #include <stdlib.h>  typedef struct Node {     int data;     struct Node* prev;     struct Node* next; } Node;  typedef struct {     Node* head;     Node* tail; } DoublyLinkedList;  DoublyLinkedList* createDoublyLinkedList() {     DoublyLinkedList* list = (DoublyLinkedList*)malloc(sizeof(DoublyLinkedList));     list->head = NULL;     list->tail = NULL;     return list; }  void insertNode(DoublyLinkedList* list, int data) {     Node* newNode = (Node*)malloc(sizeof(Node));     newNode->data = data;     newNode->prev = NULL;     newNode->next = NULL;      if (list->head == NULL) {         list->head = newNode;         list->tail = newNode;     } else {         list->tail->next = newNode;         newNode->prev = list->tail;         list->tail = newNode;     } }  void deleteNode(DoublyLinkedList* list, int data) {     Node* current = list->head;     while (current != NULL) {         if (current->data == data) {             if (current == list->head) {                 list->head = current->next;                 if (list->head != NULL) {                     list->head->prev = NULL;                 }             } else if (current == list->tail) {                 list->tail = current->prev;                 list->tail->next = NULL;             } else {                 current->prev->next = current->next;                 current->next->prev = current->prev;             }              free(current);             return;         }          current = current->next;     } }  void printList(DoublyLinkedList* list) {     Node* current = list->head;     while (current != NULL) {         printf("%d ", current->data);         current = current->next;     }     printf("\n"); }  int main() {     DoublyLinkedList* list = createDoublyLinkedList();      insertNode(list, 1);     insertNode(list, 2);     insertNode(list, 3);      printList(list);      deleteNode(list, 2);      printList(list);      return 0; } 

在上面的示例中,首先定义了Node和DoublyLinkedList结构体来表示双向链表的节点和链表。然后实现了创建双向链表、插入节点、删除节点和打印链表的操作函数。在main函数中,创建一个双向链表并对其进行操作,最后打印出链表的内容。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!