C语言 数据结构 链表的增删查改
分别用函数实现了链表的:
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语言 数据结构 链表的增删查改相关推荐
- c语言 单链表的增删查改
文章目录 1.链表基本结构 2.链表的尾插 3.链表的尾删 4.链表的头插与头删 头插 头删 5.链表的查找与修改 查找 修改 6.链表的节点插入与删除 插入 删除 1.链表基本结构 链表由一个个的节 ...
- 数据结构之单链表的增删查改等操作画图详解
单链表 文章目录 单链表 链表的概念及其结构 概念 结构 链表的实现 开辟一个新结点 链表的销毁 打印链表 单链表的尾插 单链表的头插 单链表的头删 单链表的尾删 找到单链表中的一个结点 在pos位置 ...
- Java——链表的增删查改
[基础学习] 链表的增删查改 注意:所有链表都先需要判断是否为null <1>链表的增 有三种方法,分别为:头插法,尾插法,任意节点位置插法 1.头插法 2.尾插法 3.任意节点位置插法 ...
- 数据结构C语言实现顺序表——增删查改操作实现详解
顺序表 顺序表是什么? 顺序表是将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示.实现增删查改的功能. 顺序表所需的头文件: #include<stdio.h> ...
- C语言实现顺序表(增删查改等数据管理)
顺序表seqlist 小伙伴们,提到顺序表会想到什么呢? 数组?还是链表? 其实,数组和链表都是属于线性表,而链表在逻辑上是线性的,并非物理存储上也为线性:而数组无论在逻辑上还是物理存储上均为线性 所 ...
- 单链表的增删查改等基本操作C++实现
单链表的初始化.增删查改.遍历一次找中间结点.删除一个无头单链表的非尾结点(不给头结点) #include<stdio.h> #include<stdlib.h> #inclu ...
- c语言单向循环链表实现增删,C语言单向非循环链表增删查改实现
SList.h #ifndef _SLIST_H_ #define _SLIST_H_ #include#include#include// 1.无头单向非循环链表增删查改实现 typedef int ...
- 【数据结构】单链表的增删查改(C语言实现)
文章目录 前言 一.链表 1.链表的概念及结构 2.链表的分类 3.最常用的两种链表 二.单链表的实现 1.结构的定义 2.创建新节点 3.在头部插入数据 4.在尾部插入数据 5.查找数据 6.在po ...
- c语言 增删查 案例,C语言实现单链表的增删查改
#include #include #include"linklist.h" #define Test_Header printf("\n-----%s-----\n&q ...
最新文章
- MySQL添加用户、删除用户与授权
- 第六届北京八大处新春祈福庙会大年初一迎客
- 千万数据却只用6步管理!这套数据治理架构如何100%复用?
- ossim系统下nagios监控机器可用性用rrd图形显示
- Android开发中的logcat工具使用方法
- mysql前一天_mysql查询当天,前一天,一周,一个月
- 【金融】【python】三因子(three factor)简单模型实证
- python自动化办公设置_python自动化办公之 python操作Excel
- 13. Blade 模板引擎
- ARM 与 STM32 的关系
- 程序员必备智力题集锦 (典藏版)
- 红外遥控系统原理附51单片机软件解码程序
- Bootstrap 导航/滑动门(nav)
- 《暮光之城》——如果那真的是你,就请你再勇敢一点、再直接一点,因为我早已经不可救药的爱上你了。你是吸血鬼也罢,你是致命危险也罢,你是什么,我都无所谓。
- knuth的SJT实现
- 不能忘记陪我们长大的100部电影
- (论文笔记06.High Fidelity Data Reduction for Big Data Security Dependency Analyses(CCF A)2016)
- 【Py】pyecharts数据可视化案例——地下室空气治理
- 北京高新技术企业申报新增要求及解决办法
- Levy distribution(列维分布)和Levy fligt(列维飞行)
热门文章
- java mysbatis select_java相关:详解Mybatis中的select方法
- 基于python的搜索引擎论文_技术分享 - 基于python构建搜索引擎系列——(四)检索模型...
- uva1616二分加误差处理
- Keras-数据准备
- 机器学习-分类之支持向量机(SVM)原理及实战
- linux 本机发送邮件 smtp-server 553,Zabbix监控之邮件发送失败-smtp-server: 错误代码550与535...
- Lua 和 C 交互中虚拟栈的操作和遍历
- 针对某游戏保护DebugPort清零的一次逆向
- Instsrv.exe可以给系统安装和删除服务
- 第19讲:Pyppeteer 爬取实战