C语言双链表遍历,插入,删除
#include<stdio.h> #include<stdlib.h> #include <string.h> #define bzero(a, b) memset(a, 0, b)//windows平台下无bzero函数。 增加宏拓展移植性struct node{int data; //有效数据 struct node *pLast;//指向上一个节点的指针 struct node *pNext;//指向下一个节点的指针 };struct node * make_node(int data){struct node *p=(struct node*)malloc(sizeof(struct node));if(NULL==p){printf("malloc error\n");return NULL;}//清理申请到的内存bzero(p,sizeof(struct node));//填充节点p->data=data;p->pLast=NULL;p->pNext=NULL;//将来要指向下一个节点的首地址 //实际操作时将下一个节点的malloc 返回的指针给他。 return p;}void ergodic(struct node *pH)//遍历 {int cnt=0;struct node *p=pH; /* printf("------开始遍历------\n");//这样包含头结点while(NULL!=p->pNext){ printf("第%d节点数据为为%d\n",cnt,p->data); p=p->pNext;cnt++; }printf("第%d节点数据为为%d\n",cnt,p->data); printf("------结束遍历------\n");} */printf("------开始遍历------\n");while(NULL!=p->pNext){ cnt++;p=p->pNext;printf("第%d节点数据为为%d\n",cnt,p->data); }printf("------结束遍历------\n");}void reverse_ergodic(struct node *pT)//反向遍历 {int cnt=0;struct node *p=pT; printf("------开始遍历------\n");while(NULL!=p->pLast){ cnt++;printf("第%d节点数据为为%d\n",cnt,p->data);p=p->pLast; }printf("------结束遍历------\n");} void in_tail(struct node *pH,struct node *p_new) { //先找到尾节点//插入int cnt=0;struct node *p=pH;while(NULL!=p->pNext){p=p->pNext;cnt++;}p->pNext=p_new; //插到之前最后的节点后面(后向指针)p_new->pLast=p; //之前最后的节点后面防盗新节点的向前的指针(前向指针)pH->data=cnt+1;// 头节点数据代表链表个数//前指针的pLast与新指针的pNext无变动 } void in_head(struct node *pH,struct node *p_new) { //1。将原1好节点地址给新节点后向指针//2。将头指针指向新节点//3。原1号节点前向指针指向新节点//4。新节点前向指针指向头结点int cnt=0;struct node *p=pH;while(NULL!=p->pNext){p=p->pNext;cnt++;}if(NULL==pH->pNext){pH->pNext=p_new;p_new->pLast=pH;}else{p_new->pNext=pH->pNext;pH->pNext=p_new;p_new->pNext->pLast=p_new; //不判断的话p_new->pNext->pLast会引发段错误p_new->pLast=pH; }pH->data=cnt+1;// 头节点数据代表链表个数//前指针的pLast与新指针的pNext无变动 } void del_1(struct node *pH,int num)//根据节点数删除 不能删除0(头节点) {//1找到//2删除//删除(释放内存。指向下一个)int cnt=0;struct node *p=pH; struct node *p_sb;;//临时变量释放内存用while(NULL!=p->pNext){ cnt++;if(num==cnt){ p_sb=p->pNext;//p为预删除点的上一个节点p->pNext=p->pNext->pNext;//跳过欲删除节点指向下下个节点(删除正向节点)if(NULL==p->pNext){//说明P为现在最后一个节点 } else {p->pNext->pLast=p;//(删除反向节点) } free(p_sb);//释放内存break;}p=p->pNext;//不满足上述条件时 寻找下一个节点 }}void del_2(struct node *pH,int data)//删除指定数据 {//1找到//2删除//删除(释放内存。指向下一个)struct node *p=pH; struct node *p_sb;;//临时变量释放内存用while(NULL!=p->pNext){ if(data==p->pNext->data)//p为预删除点的上一个节点{ p_sb=p->pNext;p->pNext=p->pNext->pNext;//跳过欲删除节点指向下下个节点(删除正向节点)if(NULL==p->pNext){//说明P为现在最后一个节点 } else {p->pNext->pLast=p;//(删除反向节点) } free(p_sb);continue;}p=p->pNext;}} int main() {struct node *pHead=make_node(0);//初始化头节点;in_head(pHead,make_node(1));in_head(pHead,make_node(1));in_head(pHead,make_node(3));in_head(pHead,make_node(4));reverse_ergodic(pHead->pNext->pNext->pNext->pNext);ergodic(pHead); ergodic(pHead);del_2(pHead,1);reverse_ergodic(pHead->pNext->pNext);ergodic(pHead); return 0; }
转载于:https://www.cnblogs.com/PengfeiSong/p/6283185.html
C语言双链表遍历,插入,删除相关推荐
- 用c语言实现单链表的初始化,建表,查找,求长度,插入,删除等操作,【YTU+2430+C语言习题+链表建立+插入+删除+输(5)...
的打印.判断链表是否为空.计算链表长度.插入节点.删除节点.删除整个链表.(2) 线性表adt顺序存储实现中的创建.查找.插入和删除等基本操作及相关算法,线性表adt链式存储实现中单链表.循环链表和双 ...
- 【 C 】在双链表中插入一个新值的简明程序
上两篇博文讲了如何在单链表中插入一个值: [ C ]在单链表中插入一个新节点的尝试(一) [ C ]在单链表中插入一个新节点的尝试(二) 这篇博文讲解如何在双链表中插入一个值. 单链表的替代方案就是双 ...
- 【 C 】简化双链表插入函数(对在双链表中插入一个新值的简明程序的简化)
目录 背景 第一个技巧是语句提炼(statement factoring) 第二个简化技巧 最终简化版本 背景 上篇博文:[ C ]在双链表中插入一个新值的简明程序,讲了一个简明的双链表插入函数,那个 ...
- 顺序表和单链表的插入删除操作时间复杂度的区别
顺序表和单链表的插入删除操作时间复杂度的区别 最近在学习数据结构,看到如果需要用到大量的插入和删除操作,单链表的效率会高于顺序表.看到这里时内有有个疑惑,这两种数据结构的插入和删除操作的时间复杂度不都 ...
- c语言数组指定位置插入和删除_玩转C语言链表,单链表/双向链表的建立/遍历/插入/删除...
最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...
- 双链表中插入节点(C语言实现)
文章目录 1. 相关背景介绍 1.1 双链表概念 1.2 双链表的优势与劣势 1.3 双链表插入节点的位置 2. 不同位置插入数据 2.1 在DLL的前端添加节点 2.2 在给定节点之前添加节点 2. ...
- 语言zzuli链表遍历_趣味图解算法之链表
阅读本文约需要10分钟,您可以先关注我们或收藏本文,避免下次无法找到. 之前我们通过趣味图解法为大家介绍了二分查找的算法,今天我们一起来学习日常工作中经常能用到的算法链表. 成哥就是通过这个算法解决了 ...
- c语言双链表是什么意思,双链表的表示和实现(C语言)
#include#includetypedef int ElemType; typedef struct node{ ElemType data; struct node *next; struct ...
- 双链表(插入节点操作)
在双链表L中第i个位置插入值域为e的结点. 双链表的存储结构定义: typedef struct DLinkList{int data;DLinkList * prior;DLinkList * ne ...
最新文章
- html frameset
- python enumerate()用法
- A*寻路算法的探寻与改良(三)
- 成功解决ValueError: could not convert string to float: ‘\\N‘
- 《图解密码技术》分组密码(1) 概览
- 将所有单个json标注文件合并成一个总的json标注文件(COCO数据集格式)
- C语言编写DFT计算程序, 并绘制幅度谱
- [Linux命令]Sed命令参数
- Docker - 实战TLS加密通讯
- php属于脚本,php是脚本语言吗
- unity 打包AssetBundle
- 互金策略若干问题(全)
- 【前端学习笔记】JavaScript + jQuery + Vue.js + Element-UI
- Java 如何优雅的导出 Excel
- 深入分析Linux自旋锁
- DVWA教程实践之Brute Force
- 最短路径算法----Floyd-warshall(十字交叉算法证明)
- javaweb response
- UART SPI I2C 接口介绍 转载
- 第4章 虚拟机性能监控与故障处理工具
热门文章
- (札记)Altera Stratix IV系列FPGA TRUE LVDS RX input termination 在Quartus工程中的设置方法...
- element ui只输入数字校验
- 2018年12月,华为HCNP大面积更新题目,军哥独家解题咯
- Windows Embedded Standard开发初体验(四)
- jquery和原生js-ajax
- Git error: Unable to negotiate with X.X.X.X : no matching host key type found . their offer: ssh-dss
- SpringMVC 处理multipart形式数据:java方式配置文件上传
- 公司运作 - 利润率、周转率
- 2000DC和DNS迁移到2003 R2
- 压力变动力,存储追求高效率