《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)

简介: 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)

前言


提示:本系列文章均使用Visual Studio 2019编程,编程语言为c语言。


一、循环链表


(一)定义


将单链表的终端结点的指针端由空指针改为指向头结点,这样就让整个单链表形成一个循环,这时头尾相连的单链表就称为单循环链表,即循环链表,下图的head,即为头指针。

1666885707296.jpg

将循环链表和单链表相比较,其实就在循环的判断条件上差别,单链表判断是否为空(p!=null 或 p->null!=null),循环链表是否等于头结点(p!=head 或 p->next!=head)。


(二)尾指针


事实上我们不用头指针,而改用指向终端结点的尾指针来表示循环链表,这样就使查找开始结点和终端结点就很方便。

1666885754196.jpg

我们通过一张图,进一步了解其尾指针的作用:

1666885763803.jpg


二、双向链表


(一)定义


在单链表结构中,结点只有一个指向后继的指针域next,若要查找某个结点只能顺着单链表寻找它的后继结点,为了能够高效地查找一个结点,我们只需从头指针出发查找其前驱,即我们增加一个指向其直接前驱的指针域prior,这样我们就构成了一个双向链表。其中第一个结点的前趋结点为NULL,最后一个结点的后继结点也为NULL。

指针域(prior) 数据域 指针域(next)

即,数据域为data数据,存储一个数据元素的信息;prior指针域为前驱指针域,用于存储其直接前驱存储地址的信息;next指针域为后继指针域,用于存储其后继存储地址的信息。


(二)代码


1.双向单链表的建立

分别定义数据域,前驱指针域以及后继指针域。

typedef char DataType;
typedef struct dunode
{
  DataType data;         //数据域
  struct dunode *prior;   //前驱指针域
  struct dunode *next;    //后继指针域
}DuLinkList;

2.双向单链表的插入

若要将新结点s(x为其值)插入到双向链表中两个结点o、p之间,即在p结点之前插入结点s,首先我们应该将要插入的新结点s的前驱指针域指向结点p的前一个结点o,将结点o的后继指针域指向要插入的新结点s,然后将结点s的后继指针域指向p结点,并将结点p的前驱指针域指向结点s。

void InsertList(InsertElem *p,DataType x)
{
   InsertElem *s;
   s=(InsertElem *)malloc(sizeof(InsertElem));  //生成新结点s
   s->data=x;
   s->prior=p->prior;     //也可写成s->prior=o
   p->prior->next=s;      //也可写成o->next=s
   s->next=p;
   p->prior=s;            //也可写成o=s
}

3.双向链表的删除

若要删除表中的结点p,我们首先应该将结点p的前一个结点的后继指针域指向结点p的后继指针域,将结点p后一个结点的前驱指针域指向结点p的后继指针域,然后释放结点p的空间。

void DeleteElem(DeleteList *p,DataType *x)
{
  *x=p->data;
  p->prior->next=p->next;
  p->next->prior=p->prior;
  free(p);
}


总结


以上就是本次的笔记内容,本文介绍了循环链表、双向链表的各项操作,笔记若有错误,还望指出!!!


相关文章
|
存储 安全 C语言
【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】
分支的语句,这可能不是预期的行为,这种现象被称为“case穿透”,在某些特定情况下可以利用这一特性来简化代码,但在大多数情况下,需要谨慎使用。编写一个程序,该程序需输入个人数据,进而预测其成年后的身高。根据提示,在右侧编辑器补充代码,计算并输出最终预测的身高。分支下的语句,提示用户输入无效。常量的值必须是唯一的,且在同一个。语句的作用至关重要,如果遗漏。开始你的任务吧,祝你成功!,程序将会继续执行下一个。常量都不匹配,就会执行。来确保程序的正确性。
615 10
|
小程序 C语言
【C语言程序设计——基础】顺序结构程序设计(头歌实践教学平台习题)【合集】
目录 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果: 任务描述 相关知识 编程编写一个程序,从键盘输入3个变量的值,例如a=5,b=6,c=7,然后将3个变量的值进行交换,使得a=6,b=7,c=5。面积=sqrt(s(s−a)(s−b)(s−c)),s=(a+b+c)/2。使用输入函数获取半径,格式指示符与数据类型一致,实验一下,不一致会如何。根据提示,在右侧编辑器补充代码,计算并输出圆的周长和面积。
474 10
|
存储 算法 测试技术
【C++数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】
本任务要求编写程序求两个集合的并集、交集和差集。主要内容包括: 1. **单链表表示集合**:使用单链表存储集合元素,确保元素唯一且无序。 2. **求并集**:遍历两个集合,将所有不同元素加入新链表。 3. **求交集**:遍历集合A,检查元素是否在集合B中存在,若存在则加入结果链表。 4. **求差集**:遍历集合A,检查元素是否不在集合B中,若满足条件则加入结果链表。 通过C++代码实现上述操作,并提供测试用例验证结果。测试输入为两个集合的元素,输出为有序集合A、B,以及它们的并集、交集和差集。 示例测试输入: ``` a c e f a b d e h i ``` 预期输出:
568 7
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
735 5
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
560 5
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
223 0
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
318 2
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
330 1

热门文章

最新文章