当前位置:网站首页>2. 双链表的定义+ 代码实现
2. 双链表的定义+ 代码实现
2022-08-06 20:50:00 【我把夜熬成了白_】
文章目录
1. 双链表的定义
双链表也是链表的一种。双链表的每个数据节点中都有两个指针,分别指向前驱节点和后继结点。
结构体如下:
typedef struct DNode{
//定义双链表结点类型
ElemType data; //数据域
struct DNode *prior, *next; //前驱和后继指针
}DNode, *DLinklist;
大写的’D’ 就是double的意思
DLinklist 等价于 DNode*
DLinklist 侧重于双链表的意思
DNode* 侧重于指针的意思
2. 双链表的初始化 (带头结点) :InitDLinkList(Dlinklist &L)
typedef struct DNode{
ElemType data;
struct DNode *prior, *next;
}DNode, *DLinklist;
// 初始化双链表
bool InitDLinkList(Dlinklist &L){
L = (DNode *)malloc(sizeof(DNode));
if(L==NULL)
return false;
L->prior = NULL; //头结点的prior指针永远指向NULL
L->next = NULL; //头结点之后暂时还没有结点,置空
return true;
}
void testDLinkList(){
DLinklist L;
InitDLinkList(L);
...
}
3. 判断双链表是否为空:Empty(DLinklist L)
bool Empty(DLinklist L){
if(L->next == NULL)
return true;
else
return false;
}
4. 双链表的后插:InsertNextDNode(DNode *p, DNode *s)
1、2步骤可互换 3、4步骤可互换
但1、2步 必须在 3、4步 前面
typedef struct DNode{
ElemType data;
struct DNode *prior, *next;
}DNode, *DLinklist;
// 将结点s插入到结点p之后
bool InsertNextDNode(DNode *p, DNode *s){
if(p==NULL || s==NULL)
return false;
s->next = p->next;
// 判断结点p之后是否有后继结点
if (p->next != NULL) //如果是尾巴,就不需要这步,否则会有空指针异常
p->next->prior = s;
s->prior = p;
p->next = s;
return true;
}
双链表的前插操作、按位序插入操作都可以转换成后插操作
5. 双链表的删除下一个结点 :DeletNextDNode(DNode *p)
// 删除p结点的后继结点
bool DeletNextDNode(DNode *p){
if(p==NULL)
return false;
// 找到p的后继结点q
DNode *q =p->next;
if(q==NULL)
return false;
p->next = q->next;
if(q->next != NULL)
q->next->prior=p;
free(q);
return true;
}
6. 销毁一个双链表:DestoryList(DLinklist &L)
bool DestoryList(DLinklist &L){
// 循环释放各个数据结点
while(L->next != NULL)
DeletNextDNode(L);
//销毁表时,才能删除头结点
free(L);
// 头指针置空
L=NULL;
}
7. 双链表的遍历
双链表不可随机存取,按位查找、按值查找操作都只能用遍历的方式实现。
边栏推荐
- 【量化测试】
- Servlet使用
- 【PyTorch量化实践(2)】
- R语言ggplot2可视化:使用ggpubr包的ggdotchart函数可视化分组克利夫兰点图(Cleveland dot)、自定义palette参数设置不同分组的颜色
- nuScenes数据集浅探(待完善……)
- 代码随想录笔记_动态规划_474一和零
- 如何运营独立站?
- The optimization method to solve the slow loading of the website caused by Google AdSense
- TI AM335x继任者?AM6254性能解析
- leetcode 769. Max Chunks To Make Sorted 最多能完成排序的块(中等)
猜你喜欢

接口多态的综合案例----笔记本电脑

geemap学习1:geemap的安装和配置

云GPU如何安装和启动VNC远程桌面服务?

【问题篇】整改Nacos漏洞——升级Nacos以及开启鉴权问题整理

ArcGIS Desktop 10.8软件安装包和安装教程

高并发架构设计从0到1全部合集,强烈建议收藏!

STM32MP157A | 05 - driver development based on RGB LCD LTDC interface drivers

CI/CD持续集成/持续部署

【无标题】camera2的相关介绍

STM32MP157A driver development | 03-usb host interface use (U disk)
随机推荐
R语言ggplot2可视化:基于aes函数中的fill参数自定义绘制分组折线图并添加数据点(散点)、使用scale_fill_manual函数手动添加数据点颜色度量向量(使用十六进制颜色)
3D建模师Joinx的猫耳少女建模展示
umi中如何实现路由缓存
(一)音视频:解码H264文件流程 渲染和拿到解码后源数据YUV 完整Demo
Redis+Redisson basic configuration and use
[target detection] small script: Xml tag visualization
云GPU如何安装和启动VNC远程桌面服务?
我们来聊聊锁升级吧
如何给WordPress博客网站换个漂亮的字体
mysql索引
【zeno】zeno如何为自定义节点添加功能(apply函数和ZENDEFNODE初探)
多线程---进阶
R语言时间序列数据的平滑:使用KernSmooth包的dpill函数和locpoly函数对时间序列数据进行平滑以消除噪声、使用dpill函数筛选合适的带宽值(bandwidth)
Redis+Redisson 基础配置和使用
RedisCacheManager + CacheManager [email protected] 实现注解化缓存管理
内网渗透之Token令牌窃取
The predicament of e-commerce giants is reversed, and Alibaba and Amazon have the same goal
Kotlin 协程 - 协程启动模式 CoroutineStart
初探基于OSG+OCC的CAD之Netgen体网格划分与显示
A collection of high concurrency architecture designs from 0 to 1, highly recommended collection!




