数据结构 链表_双向链表的接口定义

双向链表介绍

双向链表中的每一个元素都由3部分组成:除了数据成员、next指针外,每个元素还包含一个指向其前驱元素的指针,称为prev指针。双向链表的组成是这样的:将一些元素链接在一起,使得每个元素的next指针都指向其后继的元素,而每个元素的prev指针都指向其前驱元素。

为了标识链表的头和尾,将第一个元素的prev指针和最后一个元素的next指针设置为NULL。

要反向遍历整个双向链表,使用prev指针以从尾到头的顺序连续访问各个元素。当我们知道某个元素存储在链表在的某处时,我们可以选择按何种方式访问到它,这会非常有帮助。例如,双向链表的一种灵活性在于它提供了一种比单链表更直观的方式移除一个元素。

双向链表接口定义

dlist_init

void dlist_init(DList *list, void(*destroy)(void *data));

返回值:无
描述:初始化由list所指向的双向链表。该函数必须在双向链表做其他任何操作之前调用。当调用dlist_destroy时,这里传入的destroy参数提供了一种释放动态分配空间的方法。它的工作方式如同单链表中的list_destroy。对于双向链表,如果其中包含不需要手动释放空间的数据,destroy参数应该设置为NULL。
复杂度:O(n)
dlist_destroy

void dlist_destroy(DList *list);

返回值:无
描述:销毁由参数list所指定的双向链表。调用该函数后不允许再执行其他操作,除非用户再次调用dlist_init。dlist_destroy将移除链表中的所有元素,如果传给dlist_init的参数destroy不为NULL,则调用destroy所指定的函数,对链表中每个移除的元素数据施行资源回收操作。
复杂度:O(n),这里n代表双向链表中的元素个数。
dlist_ins_next

int dlist_ins_next(DList *list, DLIstElmt *element,const void *data)

返回值:如果插入成功则返回1,否则返回-1。
描述:将元素插入由list指定的双向链表的element元素之后

。当插入空链表中时,element可能指向任何位置,为了避免混淆,element此时应该设置为NULL。新的元素包含一个指向data的指针,因此只要该元素仍在链表中,data所引用的内存空间就应该保持合法。
由调用者负责管理data所引用的存储空间。

复杂度:O(1)
dlist_ins_prev

int dlist_ins_prev(DList *list, DLIstElmt *element,const void *data)

返回值:无
描述:将元素插入由list指定的双向链表的element元素之前

。当插入空链表中时,element可能指向任何位置,为了避免混淆,element此时应该设置为NULL。新的元素包含一个指向data的指针,因此只要该元素仍在链表中,data所引用的内存空间就应该保持合法。
由调用者负责管理data所引用的存储空间。

复杂度:O(1)
dlist_remove

int dlist_remove(DList *list, DLIstElmt *element,const void *data)

返回值:如果移除成功则返回0,否则返回-1。
描述:从由list指定的双向链表中移除由element所指定的元素。函数返回后,参数data将指向已移除元素中存储的数据域。由调用者负责管理data所引用的存储空间。
复杂度:O(1)
dlist_size

intdlist_size(DList *list)

返回值:链表中的元素个数 。
描述:这是一个宏,用来计算由list所指定的双向链表中的元素个数。
复杂度:O(1)
dlist_head

DListElmt *dlist_head(const DList *list)

返回值:返回链表的头元素。
描述:这是一个宏,用来返回由list所指定的双向链表中的头元素。
复杂度:O(1)
dlist_tail

DListElmt *dlist_tail(const DList *list)

返回值:返回链表的尾元素。
描述:这是一个宏,用来返回由list所指定的双向链表中的尾元素。
复杂度:O(1)
dlist_is_head

int *dlist_is_head(const DListElmt *element)

返回值:如果由参数element所指定的元素是链表头元素则返回1;否则返回0。
描述:这是一个宏,用来判断由参数element所指定的元素是否为链表头元素。
复杂度:O(1)
dlist_is_tail

int *dlist_is_tail(const DListElmt *element)

返回值:如果由参数element所指定的元素是链表尾元素则返回0;否则返回-1。
描述:这是一个宏,用来判断由参数element所指定的元素是否为链表尾元素。
复杂度:O(1)
dlist_data

int *dlist_data(const DListElmt *element)

返回值:返回由element所指定的链表元素的数据域。
描述:这是一个宏,用来返回由element所指定的双向链表元素的数据域。
复杂度:O(1)
dlist_next

DListElmt *dlist_next(const DListElmt *element)

返回值:返回由element所指定的元素的下一个元素。
描述:这是一个宏,用来返回由element所指定的链表元素的后继元素。
复杂度:O(1)
dlist_prev

DListElmt *dlist_prev(const DListElmt *element)

返回值:返回由element所指定的元素的前驱元素。
描述:这是一个宏,用来返回由element所指定的链表元素的前驱元素。
复杂度:O(1)
时间: 2024-11-05 20:48:54

数据结构 链表_双向链表的接口定义的相关文章

数据结构 链表_双向链表的实现与分析

双向链表的实现与分析 双向链表的组成 :1.数据成员:2.指向下一个元素的next指针:3.指向前一个元素的prev指针. 数据结构DListElmt:代表双向链表中的单个元素(节点). 数据结构DList:代表双向链表数据结构,该结构的成员同前面介绍的单链表相似. 示例1:双向链表抽象数据类型的头文件 /*dlist.h*/ #ifndef DLIST_H #define DLIST_H /*定义双向链表中的元素*/ typedef struct DListLemt_ { void *data

数据结构 链表_单链表的接口定义

链表可以说是一种最为基础的数据结构.链表由一组元素以一种特定的顺序组合或链接而成,在维护数据的集合时很有用.这一点同我们常用的数组很相似.然而,链表在很多情况下比数组更有优势.特别是在执行插入和删除操作时链表拥有更高的效率.链表需要动态的开辟存储空间,也就是存储空间是在程序运行时分配的.由于在很多应用中数据的大小在编译时并不能确定,因此这种动态分配空间的特性也是链表的一个优点. 单链表介绍 单链表(简称为链表)由各个元素之间通过一个指针彼此链接起来而组成.每个元素包含两个部分:数据成员和一个称为

【 C# 数据结构】(一) -------------------------- 泛型带头节点的单链表,双向链表实现

在编程领域,数据结构与算法向来都是提升编程能力的重点.而一般常见的数据结构是链表,栈,队列,树等.事实上C#也已经封装好了这些数据结构,在头文件 System.Collections.Generic 中,直接创建并调用其成员方法就行.不过我们学习当然要知其然,亦知其所以然. 本文实现的是链表中的单链表和双向链表,并且实现了一些基本方法 一. 定义一个链表接口 MyList 接口里声明了我们要实现的方法: interface MyList<T> { int GetLength(); //获取链表

数据结构之_单链表的实现

数据结构之_单链表的实现 1.基本概念 链式存储定义 为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息. 单链表 线性表的链式存储结构中,每个节点中只包含一个指针域,这样的链表叫单链表. 通过每个节点的指针域将线性表的数据元素按其逻辑次序链接在一起(如图). 概念解释: 表头结点 链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息 数据结点 链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息

数据结构和算法--3链表(单向链表、双向链表、环形单向链表和约瑟夫问题)

链表 链表是以节点的方式来存储 每个节点包含data域和next域,指向下一个节点 链表的各个节点不一定是连续存储 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 单向列表 最大特点是可以将物理地址上不连续的数据连接起来,通过指针来对物理地址进行操作,实现增删改查等功能. 单链表分为两种:有头链表和无头链表. 有头节点的增删改查 定义一个单链表的类: //定义一个SingleLinkedList,单链表,管理HeroNode class SingleLinkedList{ //初始

数据结构 -- 链表&amp;双向链表

链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域. 使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理.但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大.链表最明显的好处就是,常规数组排列关

单向链表和双向链表的原理及其相关实现

(一)什么是链表? 链表是线性表的一种,所谓的 线性表包含顺序线性表和链表,顺序线性表是用数组实现的,在内存中有顺序排列,通过改变数组大小实现.而链表不是用顺序实现的,用指针实现,在内存中不连 续.意思就是说,链表就是将一系列不连续的内存联系起来,将那种碎片内存进行合理的利用,解决空间的问题. 所以,链表允许插入和删除表上任意位置上的节点,但是不允许随即存取.链表有很多种不同的类型:单向链表.双向链表及循环链表. 1.那么先从单向链表着手,先看看单向链表的模拟图: 单向链表包含两个域,一个是信息

线性链表的双向链表——java实现

.线性表链式存储结构:将采用一组地址的任意的存储单元存放线性表中的数据元素. 链表又可分为: 单链表:每个节点只保留一个引用,该引用指向当前节点的下一个节点,没有引用指向头结点,尾节点的next引用为null. 循环链表:一种首尾相连的链表. 双向链表:每个节点有两个引用,一个指向当前节点的上一个节点,另外一个指向当前节点的下一个节点. 下面给出线性表双向链表的实现:java中LinkedList是线性表的链式实现,是一个双向链表. import java.util.NoSuchElementE

基础数据结构 链表、栈、队列

数据结构是程序设计中一个非常重要的部分,基本的数据结构包括链表.栈和队列,当然高级一点的还有树.图等,实际上链表.栈和队列都是线性表,只是在操作和表示方式上有所不同,线性表用顺序结构表示就是顺序表,用链结构表示就是链表,如果对线性表的操作加以限制,只能有在表尾进行插入和删除元素,这就变成栈了,如果只能允许元素从表尾插入,表头删除,这就变成队列了. 链表 /* * 数据结构 链表 * 链式结构 */ #include <iostream> using namespace std; enum St