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

目录

一、双向链表

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 使用过滤器和拦截器动…

【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(二十五)

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…

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个最好用的图纸加密软件

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

django models字段类型和参数的选择

1. CharField 解释: 用于存储短文本,如用户名、标题等。参数: max_length: 必需参数,指定最大长度。null: 是否允许数据库存储 NULL 值,默认为 False。blank: 是否允许表单提交空值,默认为 False。default: 字段的默认值。choice…

变压器结构

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

Unity3D中控制3D场景中游戏对象显示层级的详解

前言 在Unity3D开发中,控制游戏对象的显示层级(也称为渲染顺序或渲染层级)是一个常见的需求,特别是在处理复杂的3D场景时,如角色、道具、UI元素等的可见性和渲染顺序的管理变得尤为重要。Unity通过几种不同的机制来实…

Nacos配置的优先级

配置文件优先级和覆盖规则 1. 配置文件的优先级 在多个配置文件中,如果存在相同的配置项,通常有一个优先级规则来决定最终使用哪个配置值。具体规则取决于系统的设计和实现,但通常遵循以下原则: 更具体的配置覆盖更通用的配置&…

Secret

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

深度学习从入门到精通——yolov1

YOLOV1 速度快,能够达到实时的要求。在 Titan X 的 GPU 上 能够达到 45 帧每秒。 使用全图作为 Context 信息,背景错误(把背景错认为物体)比较少。 泛化能力强。 YOLO的核心思想就是利用整张图作为网络的输入,直接在…