一、双向链表的概念
双向链表基于单链表。单链表是单向的,有一个头结点,一个尾结点,要访问任何结点,都必须知道头结点,不能逆着进行。而双链表添加了一个指针域,通过两个指针域,分别指向结点的前结点和后结点。这样的话,可以通过双链表的任何结点,访问到它的前结点和后结点。
在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点的地址,一般称为右链域;一个存储直接前驱结点地址,一般称之为左链域。
双向链表结构示意图
表头为空,表头的后继节点为"节点10"(数据为10的节点);"节点10"的后继节点是"节点20"(数据为10的节点),"节点20"的前继节点是"节点10";"节点20"的后继节点是"节点30","节点30"的前继节点是"节点20";...;末尾节点的后继节点是表头。
双链表删除节点
删除"节点30"
删除之前:"节点20"的后继节点为"节点30","节点30" 的前继节点为"节点20"。"节点30"的后继节点为"节点40","节点40" 的前继节点为"节点30"。
删除之后:"节点20"的后继节点为"节点40","节点40" 的前继节点为"节点20"。
双链表添加节点
在"节点10"与"节点20"之间添加"节点15"
添加之前:"节点10"的后继节点为"节点20","节点20" 的前继节点为"节点10"。
添加之后:"节点10"的后继节点为"节点15","节点15" 的前继节点为"节点10"。"节点15"的后继节点为"节点20","节点20" 的前继节点为"节点15"。
二、C语言实现双向链表
2.1 头文件
1 #pragma once 2 //新建双向链表。成功返回链表头,否则,返回NULL 3 extern int create_dLink(); 4 //撤销双向链表,成功返回0,否则返回-1 5 extern int destory_dLink(); 6 //双向列表是否为空,为空返回1,否则返回0 7 extern int is_empty_dLink(); 8 //双向链表的大小 9 extern int dLink_size(); 10 //获取索引index位置的元素,成功返回节点指针,否则返回NULL 11 extern void* dLink_get(int index); 12 //获取双向链表中第一个元素,成功返回节点指针,否则返回NULL 13 extern void* dLink_getFirst(); 14 //获取双向链表中最后一个元素,成功返回节点指针,否则返回NULL 15 extern void* dLink_getTail(); 16 /* 17 链表中增加 18 */ 19 //在Index位置插值value,成功返回0,否则返回-1; 20 extern int dLink_insert(int index,void * pVal); 21 //在表头插入值 22 extern int dLink_insert_head(void *pVal); 23 //在表尾插入值 24 extern int dLink_insert_tail(void *pVal); 25 /* 26 链表中删除 27 */ 28 //在index处删除 29 extern int dLink_delete(int index); 30 //删除第一个节点 31 extern int dLink_delete_first(); 32 //闪电湖第二个节点 33 extern int dLink_delete_tail();