主题:双向链表
功能:分别实链表的插入、删除、查找、打印(正序、逆序)操作
提示:如果需要进入下一步操作,输入3个ctrl z即可

//主题:双向链表
//功能:分别实链表的插入、删除、查找操作
//提示:如果需要进入下一步操作,输入3个ctrl z即可#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct student
{int num;float score;struct student *pnext;struct student *ppre;
}stu, *pstu;//打印
void list_print(pstu phead, pstu ptail)
{pstu pcur = phead;printf("顺序打印:\n");while (pcur != NULL){printf("%d %2.2f\n", pcur->num, pcur->score);pcur = pcur->pnext;}printf("\n");printf("逆序打印:\n");pcur = ptail;while (pcur != NULL){printf("%d %2.2f\n", pcur->num, pcur->score);pcur = pcur->ppre;}printf("\n");
}//增:头插法(插在左边)
void list_insert_head(pstu *pphead, pstu *pptail, int i)
{pstu pnew;pnew = (pstu)calloc(1, sizeof(stu));pnew->num = i;if (NULL == *pptail)//如果链表为空{*pphead = pnew;*pptail = pnew;//不用担心尾节点不是NULL,因为calloc的pnew中的pnext成员本身就是null}else//如果链表非空{pnew->pnext = *pphead;//新节点的pnext成员指向原有链表头(*pphead)->ppre = pnew;//新节点的ppre指向原有链表头*pphead = pnew;//新节点成为新的链表头}
}//增:尾插法
void list_insert_tail(pstu *pphead, pstu *pptail, int i)
{pstu pnew;pnew = (pstu)calloc(1, sizeof(stu));pnew->num = i;if (NULL == *pptail)//如果链表为空{*pphead = pnew;*pptail = pnew;//不用担心尾节点不是NULL,因为calloc的pnew中的pnext成员本身就是null}else{(*pptail)->pnext = pnew;//原有链表尾的pnext成员指向新节点pnew->ppre = *pptail;//新节点的ppre指向原有链表尾*pptail = pnew;//新节点成为新的链表尾}
}//增:有序插入
void list_insert_sort(pstu *pphead, pstu *pptail, int i)
{pstu pnew;pnew = (pstu)calloc(1, sizeof(stu));pnew->num = i;pstu pcur = *pphead;pstu pbefore = *pphead;if (NULL == *pptail)//如果链表为空{*pphead = pnew;*pptail = pnew;//不用担心尾节点不是NULL,因为calloc的pnew中的pnext成员本身就是null}else{//从小到大if (i <= pcur->num)//如果小于第一个节点,头插{pnew->pnext = *pphead;//新节点的pnext成员指向原有链表头(*pphead)->ppre = pnew;//新节点的ppre指向原有链表头*pphead = pnew;//新节点成为新的链表头return;}else//向后遍历{while (NULL != pcur)//只要不是最后{if (i <= pcur->num)//找到插入的位置{pbefore->pnext = pnew;//小弟的pnext成员指向新节点pnew->ppre = pbefore;//新节点的ppre成员指向pbeforepnew->pnext = pcur;//新节点的pnext成员指向大哥pcur->ppre = pnew;//大哥的ppre成员指向新节点break;}pbefore = pcur;//小弟记住大哥的脚印pcur = pcur->pnext;//大哥先走一步      }if (NULL == pcur)//如果到最后,尾插{(*pptail)->pnext = pnew;//原有链表尾的pnext成员指向新节点pnew->ppre = *pptail;//新节点的ppre成员指向原有链表尾*pptail = pnew;//新节点成为新的链表尾}}}
}//删除
void list_delete(pstu *pphead, pstu *pptail, int i)
{pstu pcur = *pphead;pstu pbefore = *pphead;if (NULL == *pptail)//如果链表为空{printf("链表为空\n");}else if (i == (*pphead)->num)//如果要删除第一个节点(此时可能仅剩一个节点){(*pphead)->pnext->ppre = (*pphead)->ppre;//下一个节点的ppre指向原有头节点的ppre(=NULL)*pphead = (*pphead)->pnext;//头指针指向下一个节点free(pcur);//释放原有头节点的内存if (NULL == *pphead)//如果删除后链表为空{*pptail = NULL;}}else//如果不等于第一个节点{while (NULL != pcur)//如果pcur没有走出最后一个节点{if (i == pcur->num)//如果等于当前节点{pcur = pcur->pnext;//大哥前进一步pbefore->pnext = pcur;//小弟的pnext成员指向大哥pcur->ppre = pbefore;//大哥的ppre成员指向小弟return;}else{pbefore = pcur;//小弟记住大哥的脚印pcur = pcur->pnext;//大哥先走一步       }}if (NULL == pcur)//如果到最后{printf("不存在此数字\n");}}
}//修改
void list_modify(pstu *pphead, pstu *pptail, int i, float score)
{pstu pcur = *pphead;pstu pbefore = *pphead;if (NULL == *pptail)//如果链表为空{printf("链表为空\n");}else{while (NULL != pcur)//只要不是最后{if (i == pcur->num)//如果等于当前节点,修改{pcur->score = score;return;}else{pbefore = pcur;//小弟记住大哥的脚印pcur = pcur->pnext;//大哥先走一步       }}if (NULL == pcur)//如果到最后{printf("不存在此数字\n");}}
}//查找
void list_find(pstu *pphead, pstu *pptail, int i)
{pstu pcur = *pphead;pstu pbefore = *pphead;if (NULL == *pptail)//如果链表为空{printf("链表为空\n");}else{while (NULL != pcur)//只要不是最后{if (i == pcur->num)//如果等于当前节点,输出{printf("查询成功:\n%d %2.2f\n", i, pcur->score);return;}else{pbefore = pcur;//小弟记住大哥的脚印pcur = pcur->pnext;//大哥先走一步       }}if (NULL == pcur)//如果到最后{printf("不存在此数字\n");}}
}int main()
{int i;float score;pstu phead = NULL;pstu ptail = NULL;//增printf("请输入你要插入的数字:");while (scanf("%d", &i) != EOF){list_insert_head(&phead, &ptail, i);//头插法//list_insert_tail(&phead, &ptail, i);//尾插法//list_insert_sort(&phead, &ptail, i);//有序插入}list_print(phead, ptail);//删printf("请输入你要删除的数字:");while (scanf("%d", &i) != EOF){list_delete(&phead, &ptail, i);printf("输出:\n");list_print(phead, ptail);}//改   printf("请输入你要修改的序号和数字:");while (scanf("%d %f", &i, &score) != EOF){list_modify(&phead, &ptail, i, score);printf("输出:\n");list_print(phead, ptail);}//查printf("请输入你要查找的序号:");while (scanf("%d", &i) != EOF){list_find(&phead, &ptail, i);}system("pause");
}

C语言 双向链表的增删改查相关推荐

  1. Linux C语言连接MySQL 增删改查操作

    Linux下想要测试mysql和memcached的性能,因为是服务器只能通过终端连接,所以考虑用C语言写测试代码.于是研究了把C怎么连接MySQL以及增删改查的代码.安装mysql-client或者 ...

  2. linux c mysql 增删改查_Linux C语言连接MySQL 增删改查操作

    Linux下想要测试mysql和memcached的性能,因为是服务器只能通过终端连接,所以考虑用C语言写测试代码.于是研究了把C怎么连接MySQL以及增删改查的代码.安装mysql-client或者 ...

  3. C语言学生管理系统增删改查

    基于C语言和txt文件的增删改查 转载请注明出处 1.背景 本系统基于学生信息管理,完成了学生的信息的读取.增加.删除.修改.查询.本身意义可能不大,但是有很多学生再刚开始学习的时候,往往布置的大作业 ...

  4. 双向链表增删改查C语言代码,C语言中双向链表的增删改查输出源文件代码

    C /* 双向线性链表 * * LIST * +------+------+ * +------ | head | tail | ------+ * | +------+------+ | * | | ...

  5. 基于双向链表的增删改查和排序(C++实现)

    双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表 ...

  6. go 语言 链表 的增删改查

    上一篇写了如何来生成链表,这一篇介绍链表的基本操作. 1.求表长 表长就是链表中结点的个数 type Teacher struct{ //定义链表类型Name stringAge intNext *T ...

  7. c语言 双向链表增删修查,手写双链表,并实现增删改查

    手写双链表,并实现增删改查 public class DoublyLinkedListT { // 一个空的头节点 private final Node head = new Node(null); ...

  8. Mysql —— C语言链接mysql数据库,实现可以增删改查的角色权限登录系统

    /******************************************************************** * 标题:C语言链接mysql数据库,实现可以增删改查的角色 ...

  9. C#语言连接Mysql数据库实现增删改查

    C#语言连接Mysql数据库实现增删改查 实现效果如图 在此之前先下载一个mysql.dll 库 如下 链接:https://pan.baidu.com/s/17Nv_1W3KbXfWgdOvWf_S ...

最新文章

  1. 算法基础知识科普:8大搜索算法之红黑树(中)
  2. python 机器移植
  3. 【正一专栏】读《艾思奇哲学文选第六卷》
  4. 企业数据中心夏季冷却散热的十二大技巧
  5. HP MSA2000-硬盘leftover-trust enable处理
  6. UVa 10844 (大数)
  7. “远程桌面己停止工作”的解决方法
  8. 机器学习代码实战——线性回归(单变量)(Linear Regression)
  9. 通过实例学习编写需求文档 【转】
  10. oracle歸檔日誌,oracle歸檔日誌清理 | 學步園
  11. 【Vue】VSCode搭建Vue项目
  12. 海洋网络收音机海洋影音盒
  13. CSS实现简单的3D旋转魔方
  14. Xcode打包ipa的基本步骤(有证书和无证书)
  15. 【Struts】:Struts1和Struts2的区别与联系
  16. 基于HTML5 Canvas 实现地铁站监控
  17. 冰汽时代机器人不用热_如何评价游戏《冰汽时代》?
  18. BiERU: Bidirectional Emotional Recurrent Unitfor Conversational Sentiment Analysis(20.12.10)
  19. Redmi 游戏电视 X Pro 评测
  20. 在k8s上部署cerebro访问集群外部署的es

热门文章

  1. 百度贴吧个人主页_百度手机App商店社交应用排行榜,微信连续三个月霸占榜首...
  2. 29.rust类型转换.rs
  3. cocos2d-x游戏实例(2)-主角根据输入移动
  4. COM编程之一 组件
  5. PyCairo 中的基本绘图
  6. Chromium Android编译指南
  7. 白话科普系列——双十一,竟然是一场有“预谋”的DDoS攻击?
  8. 通过putty和 winscp操作aws机器笔记
  9. 第四期直播分享预告-高薪offer指南
  10. 内联函数和编译器对Go代码的优化