考研408复习笔记

您所在的位置:网站首页 408数据结构考代码吗 考研408复习笔记

考研408复习笔记

2024-07-14 11:15:45| 来源: 网络整理| 查看: 265

考研408复习笔记—— 数据结构(四) 前篇跳转二、线性表(三)2.4.2 双链表2.4.2.1 双链表的初始化2.4.2.2 双链表的插入2.4.2.3 双链表的插入 2.4.3 循环链表2.4.4 静态链表 2.5 顺序表与链表的对比 后篇跳转

编写不易,希望各位看到能点个赞。

若发布的内容有什么错误,欢迎留言探讨。

前篇跳转

考研408复习笔记—— 数据结构(三)

二、线性表(三) 2.4.2 双链表

双链表,同样是链式存储的结构,与单链表,只能一个方向进行遍历不同,它存储了两个指针域,用于存放前后两个结点的指针,方便开发时进行双向遍历。创建代码如下:

typedef struct DNode(){ //定义双链表 ElemType data; //数据域 struct DNode *prior,*next; //定义前驱和后继 }DNode, *DLinkList; 2.4.2.1 双链表的初始化

初始化的操作与单链表类似,同样一般采用的是带头节点的链表。具体过程就不进行描述了,直接展示代码:

//初始化双链表 bool InitDLinkList(DLinkList &L){ L=(DNode *)malloc(sizeof(DNode)); //分配一个头结点 if(L==NULL) return false; //内存不足,分配失败 L->prior=NULL; //创建前驱与后继,头节点的prior永远指向NULL L->next=NULL; return true; }

针对该链表,如果想要判断链表是否为空,就只要判断链表头结点的next指针是否为空便可以了。

2.4.2.2 双链表的插入

对于双链表的基本插入操作,我们只需要更改要插入位置结点的后继指针和插入位置原本后继结点的前驱指针就可以了。具体代码如下:

//在p结点之后插入s结点 bool InsertNextDNode(DNode *p,DNode *s){ s->next=p->next; //将s插入到p结点后更改相应指针 if(p->next !=NULL){ //如果p后有后继结点,不修改原后继结点的前驱指针 p->next->prior=s; } s->prior=p; p->next=s; }

由于双链表的遍历比较方便,因此,通过该插入操作便可以满足基本的插入需求。

2.4.2.3 双链表的插入

同样相比于单链表,咱们只需要断开想要删除的结点的前后指针没然后令其的前驱与后继相接便可以了。

代码如下:

//删除p结点的后继结点 bool DeleteNextDNode(DNode *p){ DNode *q=p->next; //找到要删除的后继结点 if(q==NULL) return false; //p不存在后继,停止操作 p->next=q->next; if(q->next!=NULL){ //q不是最后一个结点 q->next->prior=p; } free(q); //释放q return true; }

删除整个双链表操作代码:

void DestoryList(DLinkList &L){ //循环释放各个数据结点 while(L->next != NULL){ DeleteNextDNode(L); } free(L); //释放头结点 L=NULL; //头指针清空 }

相对来说,双链表的遍历比较方便,我们只需要通过next和prior指针的跳转就可以找到所有元素。进行按位查找和按值查找的操作,只需要通过计数器来定位我们所在的结点位序便可以实现,在此就不做详细的描述,大家可以自己写一些代码尝试一下。

2.4.3 循环链表

循环链表是在单链表和双链表的基础上进行改进而成的。

1、循环单链表 循环单链表中,单链表的最后一个结点的后继指针不会指向NULL而是直接指向头结点。 这样一来在初始化单链表时,我们便要将开始头结点的后继指针指向头结点,代码如下:

bool InitLinst(LinkList &L){ L=(LNode *L)malloc(sizeof(LNode)); //分配一个头结点 if(L==NULL) return false; //内存空间满,结束操作 L->next=L; //头结点后继指向头结点 return true; }

这样一来,在检测循环单链表是否为空时,我们只需要看头结点的next是不是指向头结点便可以了,而在检测结点是否为最后一个结点时,我们也只需看其的next指针是不是指向头结点,是头结点则为最后一个结点。

就使用而言,如果给的是一个单链表,随便给一个结点p,那么我们只能够看到该链表之后的数据。而循环单链表中,随便一个结点,我们就能够找到表中的所有结点。

2、循环双链表

与单链表一样,循环双链表同样需要让表头和表尾的两个元素相连接。这样就需要让表头的prior指向表尾,表尾的next指向表头。在该表中,next指针和prior指针各自形成了一个互为反向的闭环。

同样在初始化时,我们需要进行一些更改。令初始化时头结点的prior和next都指向头结点。代码如下:

bool InitDLinkList(DLinkList &L){ L=(DNode *)malloc(sizeof(DNode)); //分配一个头结点 if(L==NULL) return false; //内存不足,分配失败 L->prior=L; //创建前驱与后继,令他们指向L L->next=L; return true; }

同样的,在判断链表是否为空我们也可以得到省略, 只需看头结点的next指针是否为头结点本身。判断表尾结点则直接看该元素的next是否为头结点即可。

而在使用中,插入和删除操作我们便不需要去考虑结点p的next结点是否存在直接进行操作即可。

2.4.4 静态链表

相对于前面两种链表离散地存储数据。静态链表是一次性在内存中申请一个连续地空间来进行存放。它在链表中一部分存放数据,另一部分(游标)存放下一个结点的数组下标。如下图,0号位置为头结点,它的下一个结点指向2,2中则存放了数据e1下一个结点则为1,以此类推。而当游标的值为-1时则表示该链表在这个结点后没有其他结点了。 在这里插入图片描述 创建静态链表的代码如下:

#define MaxSize 10 //静态链表最大长度 typedef struct { ElemType data; //存储数据元素 int next; //下一个结点的数组下标 }SLinkList[MaxSize]

初始化: 在静态链表的初始化与顺序表的初始化类似,不过相应的我们需要将头结点的next值设置为-1,空余结点的next设置为-2。

void InitList(SLinkList &L){ for(int i=0; i


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭