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

目录

一、双向链表

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.mzph.cn/bicheng/53329.shtml

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

相关文章

SAP 生产订单工序删除状态撤回简介

SAP 生产订单工序删除状态撤回简介 一、业务场景二、处理办法三、系统控制一、业务场景 生产订单正常没有按工序分配物料,系统会自动会把物料分配到第一道工序中 生产订单中的0010工序中对应的组件的栏位被标识,表示有物料分配到了0010的工序中,正常情况下0010的工序被分配…

【微服务】springboot 自定义注解+反射+aop实现动态修改请求参数

目录 一、前言 二、动态修改接口请求参数的场景 2.1 动态修改请求参场景汇总 2.1.1 数据格式标准化 2.1.2 安全需要 2.1.3 参数校验与默认值设定 2.1.4 数据隐私保护 2.1.5 适配不同客户端 2.1.6 统计与监控 2.1.7 高级功能特性 三、springboot 使用过滤器和拦截器动…

Oracle rac模式下undo表空间爆满的解决

文章目录 前言一、确认对应实例的undo表空间二、确认对应实例undo的文件位置三、确认回滚段使用情况四、检查undo segment状态五、创建新的undo表空间并进行切换六、等待原undo表空间segment状态变更为offline七、删除原undo表空间以及数据文件 前言 一、确认对应实例的undo表空…

【云原生】Helm来管理Kubernetes集群的详细使用方法与综合应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

Seata环境搭建

1、Seata下载: 1.下载地址 2.下载的版本 2、Seata参数配置参考: 各种seata参数官网参考 3、Seata安装部署: 3.1.Seata新手部署指南: 3.2.在mysql8.0数据库里面建库建表 a.建数据库: create database seata; use seata;b.建…

PVN3D(一)代码框架

在windows上配置pvn3d的环境一直配不成功,主要卡在了与C联合编译上,不知道如何处理了。索性先看看代码,竟然发现与论文中的代码对应上了。希望这一段时间把环境配置好。 1.论文中的网络结构 1.RGB图像特征,通过CNN提取特征。深度…

【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:算法 目录​​​​​​​ 前言 一、三路快排的整体思路 二、三路快排的具体实现 1.测试数据、交换函数和三数取中法 2.三路快排函数 三、程序全部代码 总…

无线麦克风推荐哪些品牌,无线麦克风哪个品牌好,好的麦克风推荐

在声音创作与直播的领域里,无线领夹麦克风作为捕捉清晰声音的第一道防线,其重要性不言而喻。传统的有线麦克风及部分无线产品,难以在移动场景下提供稳定、清晰的录音效果;劣质无线领夹麦克风往往音质不稳定,甚至可能在…

数据库太慢跑崩的一大罪魁

就是非常不起眼的帐号去重计数,用 SQL 写就是 COUNT(DISTINCT …)。 帐号去重计数在商业分析中很常见也有重要的业务意义。这里的帐号可能是用户 ID、银行帐户、手机号、车牌号、…。计算逻辑基本一样,就是从某个时段的历史数据中统计出有多少个帐号满足…

缓存解决方案。Redis 和 Amazon ElastiCache 比较

欢迎来到雲闪世界。Redis 和 Amazon ElastiCache 等缓存解决方案是通过将频繁访问的数据存储在内存中来提高应用程序性能的热门选择。让我们从实施简单性、性能、成本和维护方面对它们进行比较。 实施简单 设置 Redis 需要在基础设施或云实例上安装和配置 Redis 服务器。它可…

解决 Android 上的 .NET MAUI/Xamarin.AndroidX 应用调用 ASP.NET Core API 端点时 SSL 连接被拒绝的问题

从虚拟机调用本地API报各种 SSL 连接不上的错误,这给本地调试造成了极大的不便,在被这个问题困扰了多日以后,终于在GitHub上找到答案 基于这个 帖子 ,有一个回复 他写了一个帮助类,专门用来调试本地的API,…

常见的图纸加密软件方式:推荐10个最好用的图纸加密软件

在当今竞争激烈的商业环境中,保护设计图纸等敏感信息已成为企业不可忽视的任务。图纸加密软件作为一项重要的信息安全措施,不仅能够防止未经授权的访问,还能确保设计工作的机密性和完整性。面对市场上琳琅满目的加密软件,选择一款…

变压器结构

变压器结构提供磁路,通常称为“变压器铁芯”,旨在为磁场提供流动路径。该磁路对于两个输入和输出绕组之间感应电压必不可少。 然而,这种变压器结构(两个绕组缠绕在不同的支路上)效率不高,因为初级绕组和次…

Secret

Secret 在 Kubernetes 中,Secret 是一种用于存储敏感信息的资源,比如密码、OAuth 令牌、SSH 密钥等。Secret 允许你以安全的方式将这些信息传递给 Pod,而不是硬编码在镜像或配置文件中。 配置管理中心:configMap、Secret Secre…

数据库和MySQL

ER图 实体(矩形):通常是现实世界的业务对象,当然使用一些逻辑对象也可以。 属性(椭圆):实体拥有的属性。 联系(菱形):实体与实体之间的关系。 函数依赖 函数依…

使用python+opencv解析图像和文本数据

1. 创建虚拟环境 新建文件夹, 并在文件夹中创建虚拟环境,可以使用Vscode打开文件夹, 然后在终端中输入以下命令: python -m venv venv2. 激活虚拟环境 在终端中输入以下命令: venv\Scripts\activate3. 安装依赖 在终端中输入以下命令: pip install opencv-pythonpip inst…

深度学习示例2-多输入多输出的神经网络模型

一、代码示例 from tensorflow import keras from tensorflow.keras import layers import numpy as np# 定义 多输入 多输出的模型 vocabulary_size = 1000 num_tags = 100 num_departments = 4title = keras.Input(shape=(vocabulary_size,), name = "title") tex…

kali——msfconsole的使用

目录 前言 msfconsole的使用基础 启动mfsconsole 各种辅助模块的使用 端口扫描模块(portscan) 查看端口扫描的模块 使用模块 查看所需设置 手动设置 执行 退出 各种漏洞模块的使用 nmap扫描主机漏洞 查看漏洞模块 使用漏洞模块 查看所需设…

Prometheus通过node_exporter监控Node节点,Node节点的详细指标解读

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)1.9-1.10

目录 第四门课 卷积神经网络(Convolutional Neural Networks)第一周 卷积神经网络(Foundations of Convolutional Neural Networks)1.9 池化层(Pooling layers)1.10 卷 积 神 经 网 络 示 例 ( …