当前位置: 首页 > news >正文

嵌入式学习第三十天!(单向链表练习)

1. 单向链表的逆序:

int Is_Empty_Link(LINK_LIST *plist)
{return plist->phead == NULL;
}void Reverse_Link(LINK_LIST *plist)
{LINK_NODE *ptmp = plist->phead;LINK_NODE *pinsert = NULL;plist->phead = NULL;if(Is_Empty_Link(plist)){return;}else{while(ptmp != NULL){pinsert = ptmp;ptmp = ptmp->pnext;pinsert->pnext = plist->phead;plist->phead = pinsert;}}return;
}

        在这里的逆序,利用了头插法的思想,因为利用头插法插入数据,数据是逆序插入的,最后插入的数据在最前面,最先插入的数据在最后面,那么逆序也可以使用这个思想。

2. 找到单向链表中的中间结点

LINK_NODE *Find_Center_Link(LINK_LIST *plist)
{LINK_NODE *pfast = plist->phead;LINK_NODE *pslow = plist->phead;while(pfast != NULL){pfast = pfast->pnext;if(pfast == NULL){break;}pfast = pfast->pnext;pslow = pslow->pnext;}return pslow;
}

        采用链表中比较常用的快慢指针法,那么快指针每次走两步,慢指针每次走一步,当快指针走到等于NULL的时候,慢指针刚好走到了中间结点,但是在这个地方,如果遇到偶数个结点的单向链表,那么得到的中间结点为中间的后一个结点。如果想要中间结点的前一个结点的话,那么需要修改一下判断条件:

LINK_NODE *Find_Center_Link(LINK_LIST *plist)
{LINK_NODE *pfast = plist->phead;LINK_NODE *pslow = plist->phead;while(1){pfast = pfast->pnext;if(pfast == NULL){break;}pfast = pfast->pnext;if(pfast == NULL){break;}pslow = pslow->pnext;}return pslow;
}

3. 找到单向链表的倒数第K个结点

LINK_NODE *Find_Last_K_Node(LINK_LIST *plist, int K)
{LINK_NODE *pfast = plist->phead;LINK_NODE *pslow = plist->phead;for(int i = 0; i < K; i++){if(pfast == NULL){return NULL;}pfast = pfast->pnext;}while(pfast != NULL){pfast = pfast->pnext;pslow = pslow->pnext;}return pslow;
}

        同样可以使用快慢指针法的思想,让快指针先走K步,然后再让快指针和慢指针同时一起走,当快指针走到等于NULL的时候,那么慢指针刚好比慢指针少K步,也就是倒数第K个结点

4. 删除单向链表的某个结点

int Delete_Link_Node(LINK_LIST *plist, DATA_TYPE data)
{if(Is_Empty_Link(plist)){return 0;}LINK_NODE *pfree = plist->phead;LINK_NODE *ppre = NULL;int del_cnt = 0;while(pfree != NULL){if(pfree->data == data){if(pfree == plist->phead){plist->phead = pfree->pnext;free(pfree);pfree = plist->phead;}else{ppre->pnext = pfree->pnext;free(pfree);pfree = ppre->pnext;}plist->curlen--;del_cnt++;}else{ppre = pfree;pfree = pfree->pnext;}}return del_cnt;
}

        可以发现这段代码可以将所有数据为data的链表结点都删除了,如果只想删除第一个的话,那就在找到第一个数据为data的结点以后,将结点free掉,然后直接return,那么程序就实现了只删除第一个。

5. 实现单向链表的升序排序(插入排序的思想)

int Insert_Sort_Link(LINK_LIST *plist)
{LINK_NODE *pinsert = NULL;LINK_NODE *ptmp = plist->phead;plist->phead->pnext = NULL;while(ptmp != NULL){pinsert = ptmp;ptmp = ptmp->pnext;if(pinsert->data <= plist->phead->data){pinsert->pnext = plist->phead;plist->phead = pinsert;}else{	LINK_NODE *perg = plist->phead;while(perg->pnext != NULL && pinsert->data >= perg->pnext->data){perg = perg->pnext;}pinsert->pnext = perg->pnext;perg->pnext = pinsert;}}return 0;
}

http://www.lryc.cn/news/325564.html

相关文章:

  • Linux:rpm部署Jenkins(1)
  • 新能源汽车充电桩站点烟火AI识别检测算法应用方案
  • Macbook安装Go以及镜像设置
  • 群晖NAS安装Video Station结合内网穿透实现公网访问本地影音文件
  • GitHub加速访问最简单的方法
  • MySQL数据库索引介绍
  • 中间件学习--InfluxDB部署(docker)及springboot代码集成实例
  • Go第三方框架--gin框架(一)
  • 网络安全——笔记
  • Maven pom.xml配置详解
  • 2024深圳国际电线电缆及电源产品展览会
  • 如何成功将自己开发的APP上架到应用商店
  • Jetson AGX ORIN 配置 FGVC-PIM 神经网络(包含 arm64 下面 torch 和 torchvision 配置内容)
  • mybatisplus和mybatis兼容问题
  • nodejs安装使用React
  • 防御性编程,可能是导致被裁员的更大的原因,别被误导了
  • Unity与鼠标相关的事件(自己记忆用)
  • 模型权重下载方法
  • JS基础之 数据浅拷贝与深拷贝
  • FFmpeg开发笔记(十四)音频重采样的缓存
  • 详解Python面向对象编程(一)
  • 一文带你完整了解Go语言IO基础库
  • Java基于微信小程序的校园请假系统
  • Expert Prompting-引导LLM成为杰出专家
  • Element-Plus下拉菜单边框去除教程
  • 免费redis可视化工具windows/mac都可以使用,开源免费
  • PHPCMS v9城市分站插件
  • 学习几个地图组件(基于react)
  • 【测试开发学习历程】计算机编程语言
  • 动态内存管理-传值调用错题解析