数据结构---双向链表---循环链表---栈

目录

一、双向链表

1.1.创建双向链表

1.2.头插法

1.3.尾插法

1.4.查询节点

1.5.修改节点

1.6.删除节点

1.7.打印节点

1.8.销毁链表

二、循环链表

2.1.单循环链表

2.2.双循环链表

三、栈

3.1.顺序栈

1.创建栈

2.判断栈是否满

3.判断栈是否为空

4.进栈

5.出栈 

6.销毁栈

3.2.链栈

四、总结


一、双向链表

typedef int DataType;typedef struct double_list
{DataType data;struct double_list *pnext;struct double_list *pprev;}LinkNode;

1.1.创建双向链表

LinkNode *CreateLinkList(void)
{LinkNode *phead = NULL;phead = malloc(sizeof(LinkNode));if (phead == NULL){return NULL;}phead->data = 0;phead->pnext = NULL;phead->pprev = NULL;return phead;
}

1.2.头插法

int HeadInsertLinkList(LinkNode *phead, DataType data)
{LinkNode *pnode = NULL;pnode = malloc(sizeof(LinkNode));if (pnode == NULL){return -1;}pnode->data = data;if (phead->pnext == NULL){pnode->pnext = NULL;pnode->pprev = phead;phead->pnext = pnode;}else{pnode->pnext = phead->pnext;pnode->pprev = phead;phead->pnext = pnode;pnode->pnext->pprev = pnode;}return 0;}

1.3.尾插法

int TailInsertLinkList(LinkNode *phead, DataType data)
{LinkNode *pnode = NULL;LinkNode *ptmp = NULL;ptmp = phead->pnext;pnode = malloc(sizeof(LinkNode));if (pnode == NULL){return -1;}pnode->data = data;if (phead->pnext == NULL){pnode->pnext = NULL;pnode->pprev = phead;phead->pnext = pnode;}else{while(ptmp->pnext != NULL){ptmp = ptmp->pnext;}pnode->pnext = NULL;pnode->pprev = ptmp;ptmp->pnext = pnode;}return 0;}

1.4.查询节点

LinkNode *FindLinkList(LinkNode *phead, DataType data)
{LinkNode *ptmp = NULL;if (phead->pnext == NULL){return NULL;}ptmp = phead->pnext;while (ptmp->pnext != NULL){if (ptmp->data == data){printf("%d存在\n", ptmp->data);break;}ptmp = ptmp->pnext;}return ptmp;}

1.5.修改节点

int UpdateLinkList(LinkNode *phead, DataType olddata, DataType newdata)
{LinkNode *ptmp = NULL;if (phead->pnext == NULL){return -1;}ptmp = phead->pnext;while (ptmp != NULL){if (ptmp->data == olddata){ptmp->data = newdata;}ptmp = ptmp->pnext;}return 0;}

1.6.删除节点

int DelteLinkList(LinkNode* phead, DataType data)
{LinkNode *ptmp = NULL;LinkNode *qtmp = NULL;if (phead->pnext == NULL){return -1;}ptmp = phead->pnext;qtmp = phead->pnext;while (ptmp != NULL){qtmp = qtmp->pnext;if (ptmp->data == data && ptmp->pnext != NULL){ptmp->pnext->pprev = ptmp->pprev;ptmp->pprev->pnext = ptmp->pnext;free(ptmp);}else if (ptmp->data == data && ptmp->pnext == NULL){ptmp->pprev->pnext = ptmp->pnext;free(ptmp);}ptmp =qtmp;}return 0;
}

1.7.打印节点

int PrintLinkList(LinkNode *phead)
{LinkNode *ptmp = NULL;ptmp = phead->pnext;if (phead->pnext == NULL){return -1;}while(ptmp != NULL){printf("%d ", ptmp->data);ptmp = ptmp->pnext;}printf("\n");return 0;
}

1.8.销毁链表

int DestoryLinkList(LinkNode **phead)
{LinkNode *ptmp = NULL;if ((*phead)->pnext == NULL){free(*phead);return 0;}if ((*phead)->pnext->pnext == NULL){free((*phead)->pnext);free((*phead));return 0;}ptmp = (*phead)->pnext->pnext;while(ptmp != NULL){free(ptmp->pprev);if (ptmp->pnext == NULL){free(ptmp);ptmp = NULL;continue;} ptmp = ptmp->pnext;}free(*phead);*phead = NULL;return 0;}

二、循环链表

2.1.单循环链表

2.2.双循环链表

三、栈

栈顶:允许进出栈位置

栈底:不允许进出栈的位置

3.1.顺序栈

typedef int DataType;typedef struct stack 
{DataType *pdata;int top;    int tlen;}seqstack;

1.创建栈

seqstack *CreateStack(int maxlen)
{//1.seqstack *pstack = NULL;pstack = malloc(sizeof(seqstack));if (pstack == NULL){return 0;}//2.pstack->tlen = maxlen;pstack->top = 0;pstack->pdata = malloc(maxlen * sizeof(DataType));return pstack;}

2.判断栈是否满

int IsFullStack(seqstack *pstack)
{if (pstack->top == pstack->tlen){return 1;}return 0;
}

3.判断栈是否为空

int IsEmptyStack(seqstack *pstack)
{if (pstack->top == 0){return 1;}return 0;
}

4.进栈

int EnterSqlStack(seqstack *pstack, DataType data)
{   if (IsFullStack(pstack) == 0){pstack->pdata[pstack->top] = data;pstack->top++;return 0;}else {return -1;}}

5.出栈 

DataType PopSqlStack(seqstack *pstack)
{DataType data = 0;if (IsEmptyStack(pstack) == 0){data = pstack->pdata[pstack->top - 1];pstack->top--;return data;}else{return -1;}
}

6.销毁栈

int DestroySeqStack(seqstack **seqstack)
{free((*seqstack)->pdata);free(*seqstack);*seqstack = NULL;return 0;
}

3.2.链栈

        使用普通的链表就可以实现,采用头插法插入节点,在从头第一个数据节点可以遍历删除节点,便可以实现栈先进后出的规则。

四、总结

        双向链表的好处是,可以直接访问一个节点的上一个节点;循环链表是将所有节点形成环,单循环链表,可以在末尾节点快速访问到第一个节点;双循环链表是可以,快速的访问尾节点;栈的特点就是先进栈的元素最后出战;栈的类型可以分为四种:满增栈、满减栈、空增栈、空减栈;链式栈,不要想复杂啦,普通的链表只要满足先进后出原则就可以啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/414527.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全升级:Docker部署Redis,启用密码验证

1.在自己选定的目录中创建文件夹 在redis文件夹里面创建:data文件夹和conf文件夹(文件夹名称随意) 2.在conf文件夹中创建redis.conf文件: vim redis.conf 2.1.redis.conf里面编写内容可以根据官网(Index of /releases…

CNN中的注意力机制综合指南:从理论到Pytorch代码实现

注意力机制已经成为深度学习模型,尤其是卷积神经网络(CNN)中不可或缺的组成部分。通过使模型能够选择性地关注输入数据中最相关的部分,注意力机制显著提升了CNN在图像分类、目标检测和语义分割等复杂任务中的性能。本文将全面介绍…

uniapp video标签无法播放视频

当video标签路径含有中文以及特殊字符视频就会无法播放 解决方法使用encodeURIComponent对路径进行加密处理 videoSrc data.coursewareFile? ${appConfig.apiUrl encodeURIComponent(data.coursewareFile)}: "";最后效果

(go)线性表的顺序存储

闲来无事,更新一下,线性表的顺序存储,go语言版本,效果都已经测试过,下面给出各部分细节 文章目录 1、生成一个线性表2、查找3、插入4、求长度5、改值6、删除7、遍历8、测试程序9、完整代码总结 package mainimport &q…

HashMap相关面试题(哈希表、HashMap的实现原理、HashMap的put方法的具体流程、HashMap的扩容机制、HashMap的寻址算法)

文章目录 1. 散列表(哈希表)1.1 散列表的概念1.2 散列函数1.3 散列冲突1.4 散列冲突-链表法(拉链法)1.4.1 插入操作1.4.2 查找和删除操作 2. HashMap的实现原理3. HashMap 的 put 方法的具体流程4. HashMap 的扩容机制5. HashMap …

Prometheus监控Kubernetes ETCD

文章目录 一、kubeadm方式部署etcd1.修改etcd指标接口监听地址2.prometheus中添加etcd的服务发现配置3.创建etcd的service4.grafana添加etcd监控模版 二、二进制方式部署k8s etcd1.将etcd服务代理到k8s集群2.创建etcd证书的secrets3.prometheus挂载etcd证书的secrets4.promethe…

【c++】常量周边:常量概念及定义

目录 前言 1.常量是什么? 2.常量的的类型 本质区别: 1)文字常量(无法取地址) 🌷什么是字面值?? 字面值后缀 🌷文字(字面)常量的基本类型 …

双指针--优选算法

个人主页:敲上瘾-CSDN博客 个人专栏:游戏、数据结构、c语言基础、c学习、OJ题 前言: 该篇文章我们主要来学习的是双指针算法,对于该类算法我们可以直接来做题,从题中去感知该算法的魅力,最后再从题中做总…

Elasticsearch Suggesters API详解与联想词自动补全应用

Elasticsearch Suggesters API详解与联想词自动补全应用 引言Elasticsearch Suggesters1. Term Suggester实现步骤示例 2. Phrase Suggester示例 3. Completion Suggester创建映射和插入数据查询示例 4. Context Suggester示例 Completion Suggester1. 工作原理2. 使用流程3. 使…

东软 在大健康路上“笨鸟先飞”

若不是东软医疗引入“国家队”通用技术集团作为其最重要的战略投资人,恐怕很多人并不会留意东软“蛰伏”在大健康的赛道上,已有30年。 1997年的一天,沈阳高新技术产业开发区的东大软件园里,创立东软不过6年时间的刘积仁思量着眼前…

并发性服务器

同一时刻能处理多个客户端 多进程: int init_tcp_ser(const char *ip,unsigned short port) {int sockfd socket(AF_INET,SOCK_STREAM,0);if(-1 sockfd){perror("fail socket");return -1;}struct sockaddr_in ser;ser.sin_family AF_INET;ser.sin_por…

tomcat在eclipse中起动成功,无法访问tomcat主页

最近通过geoserver的war包将,geoserver服务部署到了tomcat,发现在eclipse中启动服务后,无法访问localhost:8080主页,geoserver主页:localhost:8080/geoserver/web同样也无法访问。 只需要双击下面的server…

【生成模型系列(初级)】自编码器——深度学习的数据压缩与重构

【通俗理解】自编码器——深度学习的数据压缩与重构 第一节:自编码器的类比与核心概念 1.1 自编码器的类比 你可以把自编码器想象成一个“智能压缩机”,它能够把输入的数据(比如图片)压缩成一个更小的表示(编码&#…

MacOS使用FileZilla通过ssh密钥文件连接远程服务器(已解决)

需求描述 mac电脑,使用filezilla通过FTP连接远程服务器,使用ssh密钥文件代替密码。 版本信息 MacOS:Sonoma 14.5 M3芯片 FileZilla:3.66.5 在这里插入图片描述 连接 1. 创建站点 打开filezilla工具,右上角选择“文件 -> 站点管理器”,打开站点管理器弹窗。 2.…

仿华为车机功能之--修改Launcher3,实现横向滑动桌面空白处切换壁纸

本功能基于Android13 Launcher3 需求:模仿华为问界车机,实现横向滑动桌面空白处,切换壁纸功能(本质只是切换背景,没有切换壁纸)。 实现效果: 实现思路: 第一步首先得增加手势识别 第二步切换底图,不切换壁纸是因为切换壁纸动作太大,需要调用到WallpaperManager,耗…

StringTable

10.1. String的基本特性 String:字符串,使用一对""引起来表示String声明为final的,不可被继承String实现了Serializable接口:表示字符串是支持序列化的。String实现了Comparable接口:表示string可以比较大小…

六. 部署分类器-trt-engine-explorer

目录 前言0. 简述1. 案例运行2. 补充说明3. engine分析结语下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》,链接。记录下个人学习笔记,仅供自己参考 本次课程我们来学习课程第六章—部署分类器,一起来学习 trt-engine…

更新RK3588开发板的rknn_server和librknnrt.so【这篇文章是RKNPU2从入门到实践 --- 【5】的配套文章】

作者使用的平台有: 一台装有Windows系统的宿主机,在该宿主机上装有Ubuntu 20.04虚拟系统; 瑞芯微RK3588开发板,开发板上的系统为Ubuntu22.04系统; 更新板子的 rknn_server 和 librknnrt.so,rknn_server 和…

借鉴腾讯系统架构从小到大的过程 - 如何做好一个系统设计?不限于(慧哥)慧知开源充电桩平台

推荐一套企业级开源充电桩平台:完整代码包含多租户、硬件模拟器、多运营商、多小程序,汽车 电动自行车、云快充协议;——(慧哥)慧知开源充电桩平台;https://liwenhui.blog.csdn.net/article/details/134773779?spm1001.2014.3001…

倒计时1天!每日一题,零基础入门FPGA

近年来,FPGA工程师凭借着远高于传统软件开发工程师的薪酬,吸引了越来越多的人转行。 然而,入门FPGA并非易事。你需要有清晰的学习路线,包括它的基本组成(如可编程逻辑块CLB、输入输出块IOB、内部连线资源等&#xff0…