分别用函数实现了链表的:
1、增加(头插法,尾插法,有序插入)
2、删除
3、修改
4、查找

C代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct student
{int num;float score;struct student *pnext;
}stu, *pstu;//打印
void list_print(pstu phead, pstu ptail)
{pstu pcur = phead;while (pcur != NULL){printf("%d %2.2f\n", pcur->num, pcur->score);pcur = pcur->pnext;}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 = 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成员指向新节点*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 = pnew;//新节点成为新的链表头return;}else//向后遍历{while (NULL != pcur)//只要不是最后{if (i <= pcur->num){pbefore->pnext = pnew;//小弟的pnext成员指向新节点pnew->pnext = pcur;//新节点的pnext成员指向大哥break;}pbefore = pcur;//小弟记住大哥的脚印pcur = pcur->pnext;//大哥先走一步       }if (NULL == pcur)//如果到最后,尾插{(*pptail)->pnext = pnew;//原有链表尾的pnext成员指向新节点*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 = (*pphead)->pnext;//头指针指向下一个节点if (NULL == *pphead){*pptail = NULL;free(pcur);}}else//如果不等于第一个节点{while (NULL != pcur)//只要不是最后{if (i == pcur->num)//如果等于当前节点{pcur = pcur->pnext;//大哥前进一步pbefore->pnext = pcur;//小弟的pnext成员指向大哥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. c语言 单链表的增删查改

    文章目录 1.链表基本结构 2.链表的尾插 3.链表的尾删 4.链表的头插与头删 头插 头删 5.链表的查找与修改 查找 修改 6.链表的节点插入与删除 插入 删除 1.链表基本结构 链表由一个个的节 ...

  2. 数据结构之单链表的增删查改等操作画图详解

    单链表 文章目录 单链表 链表的概念及其结构 概念 结构 链表的实现 开辟一个新结点 链表的销毁 打印链表 单链表的尾插 单链表的头插 单链表的头删 单链表的尾删 找到单链表中的一个结点 在pos位置 ...

  3. Java——链表的增删查改

    [基础学习] 链表的增删查改 注意:所有链表都先需要判断是否为null <1>链表的增 有三种方法,分别为:头插法,尾插法,任意节点位置插法 1.头插法 2.尾插法 3.任意节点位置插法 ...

  4. 数据结构C语言实现顺序表——增删查改操作实现详解

    顺序表 顺序表是什么? 顺序表是将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示.实现增删查改的功能. 顺序表所需的头文件: #include<stdio.h> ...

  5. C语言实现顺序表(增删查改等数据管理)

    顺序表seqlist 小伙伴们,提到顺序表会想到什么呢? 数组?还是链表? 其实,数组和链表都是属于线性表,而链表在逻辑上是线性的,并非物理存储上也为线性:而数组无论在逻辑上还是物理存储上均为线性 所 ...

  6. 单链表的增删查改等基本操作C++实现

    单链表的初始化.增删查改.遍历一次找中间结点.删除一个无头单链表的非尾结点(不给头结点) #include<stdio.h> #include<stdlib.h> #inclu ...

  7. c语言单向循环链表实现增删,C语言单向非循环链表增删查改实现

    SList.h #ifndef _SLIST_H_ #define _SLIST_H_ #include#include#include// 1.无头单向非循环链表增删查改实现 typedef int ...

  8. 【数据结构】单链表的增删查改(C语言实现)

    文章目录 前言 一.链表 1.链表的概念及结构 2.链表的分类 3.最常用的两种链表 二.单链表的实现 1.结构的定义 2.创建新节点 3.在头部插入数据 4.在尾部插入数据 5.查找数据 6.在po ...

  9. c语言 增删查 案例,C语言实现单链表的增删查改

    #include #include #include"linklist.h" #define Test_Header printf("\n-----%s-----\n&q ...

最新文章

  1. MySQL添加用户、删除用户与授权
  2. 第六届北京八大处新春祈福庙会大年初一迎客
  3. 千万数据却只用6步管理!这套数据治理架构如何100%复用?
  4. ossim系统下nagios监控机器可用性用rrd图形显示
  5. Android开发中的logcat工具使用方法
  6. mysql前一天_mysql查询当天,前一天,一周,一个月
  7. 【金融】【python】三因子(three factor)简单模型实证
  8. python自动化办公设置_python自动化办公之 python操作Excel
  9. 13. Blade 模板引擎
  10. ARM 与 STM32 的关系
  11. 程序员必备智力题集锦 (典藏版)
  12. 红外遥控系统原理附51单片机软件解码程序
  13. Bootstrap 导航/滑动门(nav)
  14. 《暮光之城》——如果那真的是你,就请你再勇敢一点、再直接一点,因为我早已经不可救药的爱上你了。你是吸血鬼也罢,你是致命危险也罢,你是什么,我都无所谓。
  15. knuth的SJT实现
  16. 不能忘记陪我们长大的100部电影
  17. (论文笔记06.High Fidelity Data Reduction for Big Data Security Dependency Analyses(CCF A)2016)
  18. 【Py】pyecharts数据可视化案例——地下室空气治理
  19. 北京高新技术企业申报新增要求及解决办法
  20. Levy distribution(列维分布)和Levy fligt(列维飞行)

热门文章

  1. java mysbatis select_java相关:详解Mybatis中的select方法
  2. 基于python的搜索引擎论文_技术分享 - 基于python构建搜索引擎系列——(四)检索模型...
  3. uva1616二分加误差处理
  4. Keras-数据准备
  5. 机器学习-分类之支持向量机(SVM)原理及实战
  6. linux 本机发送邮件 smtp-server 553,Zabbix监控之邮件发送失败-smtp-server: 错误代码550与535...
  7. Lua 和 C 交互中虚拟栈的操作和遍历
  8. 针对某游戏保护DebugPort清零的一次逆向
  9. Instsrv.exe可以给系统安装和删除服务
  10. 第19讲:Pyppeteer 爬取实战