1.单向链表

6.链表的查找

在链表中找到指定的第一个元素

  • 沿用遍历思想,每次访问一个节点元素判断是否为要找的节点
  • 符合条件返回该节点地址
  • 到最后没有找到符号条件的节NULL
linknode *find_linklist(linknode *phead, datatype tmpdata)
{linknode *ptmpnode = NULL;ptmpnode = phead->pnext;while(ptmpnode != NULL){if(ptmpnode->data == tmpdata){return ptmpnode;}else{ptmpnode = ptmpnode->pnext;}}return NULL;
}

7.链表的修改

沿用遍历思想,找到需要修改的节点

/*更换链表老元素为新元素*/
int update_linklist(linknode *phead, datatype olddata, datatype newdata)
{linknode *ptmpnode = phead->pnext;while(ptmpnode != NULL){if(ptmpnode->data == olddata){ptmpnode->data = newdata;ptmpnode = ptmpnode->pnext;}else{ ptmpnode = ptmpnode->pnext;   }}return 0;
}

8.尾插法

在链表结尾插入一个元素

  • 申请节点空间
  • 将数据存放到节点中
  • 将节点中地址赋值为NULL
  • 找到最后一个节点
  • 最后一个节点的pnext赋值为新申请节点
int insert_tail_linklist(linknode *phead, datatype tmpdata)
{linknode *ptmpnode = NULL;linknode *pnewnode = NULL;ptmpnode = phead;       //从空白节点开始找pnewnode = malloc(sizeof(linknode));if(NULL == pnewnode){perror("fail to malloc");return -1;}while(ptmpnode->pnext != NULL){ptmpnode = ptmpnode->pnext;}pnewnode->data = tmpdata;pnewnode->pnext = NULL;ptmpnode->pnext = pnewnode;return 0;
}

 9.链表的销毁

  • 定义两个指针pfreenode和ptmpnode都指向头结点
  • ptmpnode向后走
  • 再释放pfreenode指向的节点
  • 再将pfreenode指向ptmpnode指向的空间
void destroy_linklist(linknode **pphead)
{linknode *ptmpnode = NULL;linknode *pfreenode = NULL;pfreenode = *pphead;ptmpnode = *pphead;while(ptmpnode != NULL){ptmpnode = ptmpnode->pnext;free(pfreenode);pfreenode = ptmpnode;}*pphead = NULL;return;
}

10.查找链表的中间节点

  • 快指针每次走2步,慢指针每次走1步
  • 快指针走到末尾,慢指针走到中间
linknode *find_midnode(linknode *phead)
{linknode *pfast = NULL;linknode *pslow = NULL;pfast = pslow = phead->pnext;while(pfast != NULL){pfast = pfast->pnext;if(pfast == NULL){break;}        pfast = pfast->pnext;if(pfast == NULL){break;}pslow = pslow->pnext;}return pslow;
}

11.查找链表倒数第k个节点

  • 快指针先走k步
  • 慢指针和快指针每次走一步
  • 快指针到达末尾,慢指针少走k步,即倒数第k个元素
/*查找链表倒数第k个节点*/
linknode *find_last_kth_node(linknode *phead, int k)
{int i = 0;linknode *pfast = NULL;linknode *pslow = NULL;pfast = phead->pnext;pslow = phead->pnext;for(i = 0; i < k && pfast != NULL; i++){pfast = pfast->pnext;}if(pfast == NULL){return NULL;}while(pfast != NULL){pfast = pfast->pnext;pslow = pslow->pnext;}return pslow;
}

12.不知道头节点地址,如何删除链表中间节点

  • 将指针指向的下一个节点的值覆盖当前节点的值
  • 删除下一个节点
void delete_linknode(linknode *ptmpnode)
{linknode *pnextnode = NULL;pnextnode = ptmpnode->pnext;ptmpnode->data = pnextnode->data;ptmpnode->pnext = pnextnode->pnext;free(pnextnode);return;
}

13.链表的倒置

将链表所以元素倒置

  • 将原链表断开
  • 将所有的元素依次使用头插法插入
void reverse_linklist(linknode *phead)
{linknode *ptmpnode = NULL;linknode *pinsertnode = NULL;//将链表从头结点断开ptmpnode = phead->pnext;phead->pnext = NULL;//依次将所有元素使用头插法插入链表while(ptmpnode != NULL){pinsertnode = ptmpnode;ptmpnode = ptmpnode->pnext;pinsertnode->pnext = phead->pnext;phead->pnext = pinsertnode;}return;
}

14.链表的排序

冒号排序

  • 采用冒号排序思想,定义两个指针,相邻两个元素比较
  • 指针循环向后走,直到ptmnode2为NULL,即等于pend,循环停止
  • pend赋值为ptmpnode1的节点地址
  • 下一轮就可以少比一次
void bubble_sort_linklist(linknode *phead)
{linknode *ptmpnode1 = NULL;linknode *ptmpnode2 = NULL;linknode *pend = NULL;datatype tmpdata;if(NULL == phead->pnext || NULL == phead->pnext->pnext){return;}while(1){ptmpnode1 = phead->pnext;ptmpnode2 = phead->pnext->pnext;if(ptmpnode2 == pend){break;}while(ptmpnode2 != pend){if(ptmpnode1->data > ptmpnode2->data){tmpdata = ptmpnode1->data;ptmpnode1->data = ptmpnode2->data;ptmpnode2->data = tmpdata;}ptmpnode1 = ptmpnode1->pnext;ptmpnode2 = ptmpnode2->pnext;}pend = ptmpnode1;}return;
}

选择排序

  • pswapnode指向要交换的节点
  • pminnode假设的最小值
  • ptmpnode和后续节点比较
void select_sort_linklist(linknode *phead)
{linknode *pminnode = NULL;linknode *pswapnode = NULL;linknode *ptmpnode = NULL;datatype tmpdata;if(NULL == phead->pnext || NULL == phead->pnext->pnext){return;}pswapnode = phead->pnext;while(pswapnode->pnext != NULL){pminnode = pswapnode;ptmpnode = pswapnode->pnext;while(ptmpnode != NULL){if(ptmpnode->data < pminnode->data){pminnode = ptmpnode;}ptmpnode = ptmpnode->pnext;}if(pminnode != pswapnode){tmpdata = pminnode->data;pminnode->data = pswapnode->data;pswapnode->data = tmpdata;}pswapnode = pswapnode->pnext;}return;
}

15.判断链表是否有环

  • 判断链表是否有环
  • 计算环长
  • 找到环的入口位置

判断是否有环

  • 定义两个指针:快指针(每次2步)和慢指针(每次走1步)
  • 快指针-慢指针 == 环长即相遇, 快指针和慢指针相等即为链表有环

计算环长

  • 定义一个指针从环相遇开始走一圈,知道走到该节点为止
  • 每走一个节点计数,最终得到环长

获得环的入口位置

  • 定义一个指针,从相遇点开始每次走一步,定义一个指针,从开头每次走一步
  • 两个指针相遇即为环入口

2.双向链表

1.创建空链表

参考单向链表的创建

linknode *creat_empty_linlist(void)
{linknode *ptmpnode = NULL;ptmpnode = malloc(sizeof(linknode));if(NULL == ptmpnode){perror("fail to malloc");return NULL;}ptmpnode->pnext = NULL;ptmpnode->ppre = NULL;return ptmpnode;
}

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

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

相关文章

MySQL 备份利器 Xtrabackup 全解析:从部署到恢复的实战指南

数据库备份恢复是 DBA 的 “保命” 技能&#xff0c;生产业务不仅要保证有合适的备份策略&#xff0c;也要定期验证备份的有效性和恢复演练流程&#xff0c;因为数据恢复和验证可能会涉及多方合作&#xff0c;演练可以让灾难真正发生时&#xff0c;多方配合有条不紊的将数据恢复…

EAGLE-2:通过动态草稿树加速语言模型推理

温馨提示&#xff1a; 本篇文章已同步至"AI专题精讲" EAGLE-2&#xff1a;通过动态草稿树加速语言模型推理 摘要 现代 Large Language Models&#xff08;LLMs&#xff09;的推理过程既昂贵又耗时&#xff0c;而 speculative sampling 已被证明是一种有效的解决方案…

防水防尘防摔性能很好的智能三防手机,还有22000mAh大电池

在电力巡检的崇山峻岭间&#xff0c;在野外地质勘探的风沙深处&#xff0c;在应急救援的急风骤雨里&#xff0c;传统智能设备因其固有的脆弱性与续航短板往往力不从心&#xff0c;甚至成为保障工作连续性的掣肘。而真正的智能三防手机应是一堵移动的堡垒&#xff0c;集坚不可摧…

Charles中文版抓包工具使用指南 提高API调试和网络优化效率

在现代开发过程中&#xff0c;调试API、捕获HTTP/HTTPS流量和优化应用的网络性能已经成为开发者的常见任务。尤其是在调试复杂的API接口和分析网络请求时&#xff0c;开发者需要一款高效且功能强大的工具。Charles抓包工具凭借其强大的网络调试功能和易用的操作界面&#xff0c…

【C#补全计划:类和对象(九)】接口

一、接口的概念1. 概念&#xff1a;接口是行为的抽象规范&#xff0c;也是一种自定义类型2. 接口声明规范&#xff1a;&#xff08;1&#xff09;不包含成员变量&#xff08;2&#xff09;只包含属性、方法、索引器、事件&#xff08;3&#xff09;成员不能被实现&#xff08;4…

SRS简介及简单demo

SRS介绍 SRS(Simple Realtimes Server)是一款开源的实时流媒体服务器,专注于解决直播、实时互动等场景的流媒体传输问题。SRS 的设计目标是 “简单、稳定、高效”,专门针对实时流媒体协议(如 RTMP、HLS、HTTP-FLV、WebRTC 等)进行优化,专注于解决 “低延迟、高并发” 的…

python基础:数据解析BeatuifulSoup,不需要考虑前端形式的一种获取元素的方法

1.beatuifulSoup 基本用法 beautifulSoup&#xff08;简称bs4&#xff09;是python的一个第三方库&#xff0c;用于解析html和xml文档中提取数据的python库。它能够将复杂的文档转化为树形结构&#xff0c;方便快速定位和提取所需数据以及查找和修改&#xff0c;常常与爬虫框架…

Ubuntu共享文件夹权限设置

在Ubuntu中设置共享文件夹的权限&#xff08;只读、读写、无权限&#xff09;&#xff0c;主要通过两种方式实现&#xff1a;‌文件系统权限‌和‌Samba共享配置‌。以下是详细步骤&#xff1a;‌一、文件系统权限设置&#xff08;基础权限&#xff09;‌1. ‌修改文件夹所有权…

小程序点击菜单栏实现样式动态切换

小程序点击菜单栏背景样式动态切换 前言&#xff1a;今天做一个小程序项目&#xff0c;要做一个菜单栏动态切换的功能&#xff0c;因为这种需求很常见&#xff0c;这次干脆记录一下&#xff0c;帮助别人的同时&#xff0c;自己下次也可以直接照搬使用。 效果截图如下&#xff1…

掌握工程化固件烧录,开启你的技术进阶之路-FPGA ISE(xilinx)

1、电脑需先行安装ISE14.7。若已完成安装&#xff0c;此步骤可略过&#xff1b;若尚未安装&#xff0c;在后续章节会介绍如何安装ISE&#xff0c;由于ISE14.7的安装程序体量庞大&#xff0c;可借助U盘进行传输。同时&#xff0c;电脑需预留至少30G的存储空间以用于安装该程序。…

Android 之 面试八股文

​1.Activity生命周期​​​​问题​​&#xff1a;描述Activity从启动到销毁的完整生命周期方法&#xff0c;并说明onSaveInstanceState()的调用时机。​​参考答案​​&#xff1a;onCreate()→ onStart()→ onResume()&#xff08;活跃状态&#xff09; → onPause()&#x…

暴力解决MySQL连接失败

本文涉及清空root密码完全重置MySQL权限彻底卸载并重装MySQL请务必在测试/本地环境操作&#xff0c;生产环境慎用&#xff01;场景Spring Boot项目连接MySQL一直报Access denied for user rootlocalhost&#xff0c;改密码、换驱动都没用&#xff1f;步骤1&#xff1a;完全重置…

前端开发:CSS(1)—— 什么是CSS?

本文用于记录前端开发的学习过程。前面我们已经学习了html的编写&#xff0c;知道了Web开发的一些最基本的知识&#xff1b;在html的学习过程中&#xff0c;我们提到关于样式的设计和修改常需要使用CSS来实现。那么CSS到底是什么东西呢&#xff1f;它又如何来设计样式呢&#x…

数据结构(4)—栈和队列

一、概念1.栈只允许在栈顶位置入栈和出栈元素&#xff0c;链表可以在任意位置插入和删除元素&#xff0c;栈和队列只允许在指定位置插入和删除元素2.链表、栈和队列都是一种线性结构&#xff08;一对一&#xff09;&#xff0c;栈和队列是一种特殊的表状结构二、栈1.基础概念先…

vue2.如何给一个页面设置动态的name。不同路由使用一样的组件。页面不刷新怎么办?

page里面detail.vue export default { name: detail, } vue2里面.vue的页面都会设置一个name&#xff0c;这个通常是写死的。不能在页面动态设置的。页面刷新缓存通常都是根据这个name来判断的。如果name写死。我几个页面都通用这一个页面的话&#xff0c;他也不刷新页面啊。 比…

浮动IP(Floating IP)的删除通常需要满足什么条件

浮动IP&#xff08;Floating IP&#xff09;的删除通常需要满足什么条件在云计算或网络环境中&#xff0c;浮动IP&#xff08;Floating IP&#xff09;的删除通常需要满足一定的条件&#xff0c;以确保操作不会影响现有业务或导致网络中断。以下是常见的可删除浮动IP的场景和条…

机器学习之随机森林(Random Forest)实战案例

一、算法基础 首先&#xff0c;来介绍一下算法的基础语法 class sklearn.ensemble.RandomForestClassifier(\ n_estimators’warn’,\ criterion’gini’,\max_depthNone, \ min_samples_split2,\ min_samples_leaf1, \ min_weight_fraction_leaf0.0, \ max_features’auto’…

《C语言》指针练习题--1

《C语言》指针练习题–1 1. 交换两个整数的值 题目描述&#xff1a; 编写一个C程序&#xff0c;定义一个函数swap&#xff0c;使用指针参数交换两个整数的值。在main函数中调用该函数并输出交换后的结果。 解题思路&#xff1a; 为了交换两个整数的值&#xff0c;可以通过指针传…

应急响应整理

目录 windows下 1. 检查账号安全 利用注册表实现用户隐藏 粘滞键后门 2 检查异常端口、进程 3. 检查启动项、计划任务、服务 4. 日志分析-Windows 常见事件类型、登录类型 Linux下 1. 账号安全 2. 历史命令 3. 检查异常端口 4. 检查异常进程 5. 检查开机启动项 …

一文读懂 C# 中的 Bitmap

一文读懂 C# 中的 Bitmap 一、Bitmap 到底是什么? 二、推荐使用场景 三、实战 Demo 基础用法:加载、创建和保存 进阶用法 缩放图片 裁剪图片 颜色调整(反色处理) 四、核心方法和属性说明 常用函数 常用属性 五、避坑指南、注意事项 六、总结与决策 一文读懂 C# 中的 Bitmap…