#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语言双链表遍历,插入,删除相关推荐

  1. 用c语言实现单链表的初始化,建表,查找,求长度,插入,删除等操作,【YTU+2430+C语言习题+链表建立+插入+删除+输(5)...

    的打印.判断链表是否为空.计算链表长度.插入节点.删除节点.删除整个链表.(2) 线性表adt顺序存储实现中的创建.查找.插入和删除等基本操作及相关算法,线性表adt链式存储实现中单链表.循环链表和双 ...

  2. 【 C 】在双链表中插入一个新值的简明程序

    上两篇博文讲了如何在单链表中插入一个值: [ C ]在单链表中插入一个新节点的尝试(一) [ C ]在单链表中插入一个新节点的尝试(二) 这篇博文讲解如何在双链表中插入一个值. 单链表的替代方案就是双 ...

  3. 【 C 】简化双链表插入函数(对在双链表中插入一个新值的简明程序的简化)

    目录 背景 第一个技巧是语句提炼(statement factoring) 第二个简化技巧 最终简化版本 背景 上篇博文:[ C ]在双链表中插入一个新值的简明程序,讲了一个简明的双链表插入函数,那个 ...

  4. 顺序表和单链表的插入删除操作时间复杂度的区别

    顺序表和单链表的插入删除操作时间复杂度的区别 最近在学习数据结构,看到如果需要用到大量的插入和删除操作,单链表的效率会高于顺序表.看到这里时内有有个疑惑,这两种数据结构的插入和删除操作的时间复杂度不都 ...

  5. c语言数组指定位置插入和删除_玩转C语言链表,单链表/双向链表的建立/遍历/插入/删除...

    最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...

  6. 双链表中插入节点(C语言实现)

    文章目录 1. 相关背景介绍 1.1 双链表概念 1.2 双链表的优势与劣势 1.3 双链表插入节点的位置 2. 不同位置插入数据 2.1 在DLL的前端添加节点 2.2 在给定节点之前添加节点 2. ...

  7. 语言zzuli链表遍历_趣味图解算法之链表

    阅读本文约需要10分钟,您可以先关注我们或收藏本文,避免下次无法找到. 之前我们通过趣味图解法为大家介绍了二分查找的算法,今天我们一起来学习日常工作中经常能用到的算法链表. 成哥就是通过这个算法解决了 ...

  8. c语言双链表是什么意思,双链表的表示和实现(C语言)

    #include#includetypedef int ElemType; typedef struct node{ ElemType data; struct node *next; struct ...

  9. 双链表(插入节点操作)

    在双链表L中第i个位置插入值域为e的结点. 双链表的存储结构定义: typedef struct DLinkList{int data;DLinkList * prior;DLinkList * ne ...

最新文章

  1. html frameset
  2. python enumerate()用法
  3. A*寻路算法的探寻与改良(三)
  4. 成功解决ValueError: could not convert string to float: ‘\\N‘
  5. 《图解密码技术》分组密码(1) 概览
  6. 将所有单个json标注文件合并成一个总的json标注文件(COCO数据集格式)
  7. C语言编写DFT计算程序, 并绘制幅度谱
  8. [Linux命令]Sed命令参数
  9. Docker - 实战TLS加密通讯
  10. php属于脚本,php是脚本语言吗
  11. unity 打包AssetBundle
  12. 互金策略若干问题(全)
  13. 【前端学习笔记】JavaScript + jQuery + Vue.js + Element-UI
  14. Java 如何优雅的导出 Excel
  15. 深入分析Linux自旋锁
  16. DVWA教程实践之Brute Force
  17. 最短路径算法----Floyd-warshall(十字交叉算法证明)
  18. javaweb response
  19. UART SPI I2C 接口介绍 转载
  20. 第4章 虚拟机性能监控与故障处理工具

热门文章

  1. (札记)Altera Stratix IV系列FPGA TRUE LVDS RX input termination 在Quartus工程中的设置方法...
  2. element ui只输入数字校验
  3. 2018年12月,华为HCNP大面积更新题目,军哥独家解题咯
  4. Windows Embedded Standard开发初体验(四)
  5. jquery和原生js-ajax
  6. Git error: Unable to negotiate with X.X.X.X : no matching host key type found . their offer: ssh-dss
  7. SpringMVC 处理multipart形式数据:java方式配置文件上传
  8. 公司运作 - 利润率、周转率
  9. 2000DC和DNS迁移到2003 R2
  10. 压力变动力,存储追求高效率