一、双向链表的概念

    双向链表基于单链表。单链表是单向的,有一个头结点,一个尾结点,要访问任何结点,都必须知道头结点,不能逆着进行。而双链表添加了一个指针域,通过两个指针域,分别指向结点的前结点和后结点。这样的话,可以通过双链表的任何结点,访问到它的前结点和后结点。

    在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点的地址,一般称为右链域;一个存储直接前驱结点地址,一般称之为左链域。

    双向链表结构示意图

    

C语言双向链表讲解

表头为空,表头的后继节点为"节点10"(数据为10的节点);"节点10"的后继节点是"节点20"(数据为10的节点),"节点20"的前继节点是"节点10";"节点20"的后继节点是"节点30","节点30"的前继节点是"节点20";...;末尾节点的后继节点是表头。

双链表删除节点

C语言双向链表讲解

删除"节点30"
删除之前:"节点20"的后继节点为"节点30","节点30" 的前继节点为"节点20"。"节点30"的后继节点为"节点40","节点40" 的前继节点为"节点30"。
删除之后:"节点20"的后继节点为"节点40","节点40" 的前继节点为"节点20"。

 

双链表添加节点

C语言双向链表讲解

在"节点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();
View Code

相关文章: