以下是基于Linux系统,用C语言实现的一个万能双向链表。上一篇写了一个单向的链表,本次写一个双向的链表。其中说的万能,指的是在定义结点的结构体时,用void *data的一个指针变量来存放,要添加的结构数据。这样一来,无论是怎样的数据结构内容,使用这个void *data都能够搞定。
具体代码如下,该代码,如果要使用到你的工程中。需要你先看懂,然后怎么调用增删改查的函数接口。这个双向链表,定义了头结点Node *head、尾结点Node *tail、前驱结点Node *prev、后继结点Node *next四个关键指针变量。
#include <stdio.h>#include <stdlib.h>// 结点结构体typedef struct Node {void *data; // void指针,可以存储任意类型数据struct Node *prev;struct Node *next;} Node;// 链表结构体typedef struct List {Node *head;Node *tail;} List;// 初始化链表void initList(List *list) {list->head = list->tail = NULL;}// 向链表头部添加元素void addHead(List *list, void *data) {Node *newNode = (Node*)malloc(sizeof(Node));newNode->data = data;if (list->head == NULL) {list->head = list->tail = newNode;newNode->prev = newNode->next = NULL;} else {newNode->next = list->head;list->head->prev = newNode;list->head = newNode;newNode->prev = NULL;}}// 向链表尾部添加元素void addTail(List *list, void *data) {Node *newNode = (Node*)malloc(sizeof(Node));newNode->data = data;if (list->tail == NULL) {list->head = list->tail = newNode;newNode->prev = newNode->next = NULL;} else {newNode->prev = list->tail;list->tail->next = newNode;list->tail = newNode;newNode->next = NULL;}}// 删除链表头部元素void deleteHead(List *list) {if (list->head == NULL) return;Node *next = list->head->next;free(list->head);if (next == NULL) {list->head = list->tail = NULL;} else {next->prev = NULL;list->head = next;}}// 删除链表尾部元素void deleteTail(List *list) {if (list->tail == NULL) return;Node *prev = list->tail->prev;free(list->tail);if (prev == NULL) {list->head = list->tail = NULL;} else {prev->next = NULL;list->tail = prev;}}int main() {List list;initList(&list);addHead(&list, "a");addTail(&list, "b");addTail(&list, "c");deleteHead(&list);deleteTail(&list);}
【多余的解释:】
其中的五个秒点:void *data、头结点、尾结点、前驱结点、后继结点。