数据结构之链表的实际应用
今天给大家分享链表的实际应用,很多人学数据结构时总是学课本里的伪代码,其实看懂了课本的伪代码只是学会了数据结构的20%,在学数据结构时我们应该要多注重实践,多用已学的数据结构来解决一些实践的问题。下面是我自己写的链表完整代码(包括创建链表,链表插入数据,链表删除数据,修改链表指定位置的值),以供大家参考。
完整源代码:
#include <stdio.h>
#include <stdlib.h>
struct Stu *create(int n);
void print(struct Stu *head);
void deleteNode(struct Stu *head,int n);
void insertNode(struct Stu *head,int n);
void change(struct Stu *head,int n);
struct Stu{//定义结构体
int id;
char name[50];
struct Stu *next;
};
int main(){
int n,j,in,cn;
char c;
struct Stu *head = NULL; //创建头指针
printf("请输入你想要创建的节点个数:\n");
scanf("%d",&n);
head = create(n);
print(head);
while(true){
printf("请选择你想要执行的操作:\n");
printf("1.插入节点\n2.删除节点\n3.修改节点\n4.退出程序\n");
scanf(" %c",&c);
if(c =='1'){
printf("你想要在哪插入节点:\n");
scanf("%d",&in);
insertNode(head,in);
print(head);
}else if(c == '2'){
printf("你想要删除哪个节点的数据:\n");
scanf("%d",&j);
deleteNode(head,j);
print(head);
}else if(c =='3'){
printf("你想要修改哪个节点的数据:\n");
scanf("%d",&cn);
change(head,cn);
print(head);
}else if(c =='4'){
exit(0);
}
}
}
struct Stu *create(int n){
struct Stu *head,*node,*end; //定义头节点,普通节点,尾节点
head = (struct Stu *)malloc(sizeof(struct Stu)); //给头节点申请内存
//head->id = n; //头节点的数据域保存链表的长度
end = head; //若是空表,则头尾地址一致
for(int i=0;i<n;i++){ //利用for循环向链表中添加数据
node = (struct Stu *)malloc(sizeof(struct Stu));//给普通节点申请内存空间
scanf("%d %s",&node->id,node->name); //给数据域赋值
end->next = node; //让上一个节点的数据域指向当前节点
end = node; //end指向当前节点,最终end指向尾节点 ,end指针向后移动
}
end->next = NULL; //给end的指针域置空
return head; //返回头节点的地址
}
void print(struct Stu *head){
struct Stu *p = head;
int j =1;
p = p->next; //不打印头节点的数据域中的值
while(p != NULL){
printf("%d\t%d\t%s\n",j,p->id,p->name);//遍历整个链表,给整个链表赋值
p = p->next;
j++;
}
}
void deleteNode(struct Stu *head,int n){ //删除n处的节点
struct Stu *p = head,*pr = head;
int i =0;
while(i<n&&p!=NULL){ //到达指定节点,此时p指向指定节点,pr指向上一节点
pr = p;
p = p->next;
i++;
}
if(p!=NULL){
pr->next = p->next;
free(p);
} else{
printf("节点不存在!\n");
}
}
void insertNode(struct Stu *head,int n){ //插入节点
struct Stu *p = head,*pr;
pr = (struct Stu*)malloc(sizeof(struct Stu)); //让pr指向新建节点申请的内存
printf("input data:\n");
scanf("%d %s",&pr->id,pr->name);
int i = 0;
//当插入位置是尾节点时,只要在尾节点后再插入一个节点,并让尾节点的指针域指向新建节点,新建节点的指针域置空
while(i<n&&p!=NULL){ //使p指向将要插入节点的位置
p = p->next;
i++;
}
if(p!=NULL){ //如果p没越界
pr->next = p->next; //将新建节点的地址指向将要插入节点的后一个节点的地址 。pr在p之后。
p->next = pr; //使插入节点指向新建节点
}else{
printf("节点不存在!\n");
}
}
void change(struct Stu *head,int n){
struct Stu *p = head;
int i = 0;
while(i<n && p!=NULL){ //使p指向需修改节点
p = p->next;
i++;
}
if(p != NULL){
printf("请输入修改之后的值:\n");
scanf("%d %s",&p->id,p->name);
}else{
printf("节点不存在!\n");
}
}
执行程序效果图:
本贴为博主亲手整理。如有错误,请评论区指出,一起进步。谢谢大家的浏览。
数据结构之链表的实际应用相关推荐
- c语言将一个已知头结点的单链表逆序_C语言数据结构实现链表逆序并输出
C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include #incl ...
- C/C++版数据结构之链表三
今天来讨论下链表中的双向链表. 双向链表: 概念:在双向链表中,结点除含有数据域外,还含有两个指针域:一个存储直接后继结点的地址,称为右链域:另一个存储直接前驱结点的地址,称为左链域. typedef ...
- 20175330 数据结构-单链表(选做)
要求 参见附件,补充MyList.java的内容,提交运行结果截图(全屏) 课下推送代码到码云 ``` public class MyList { public static void mai ...
- linux内核数据结构之链表
1.前言 最近写代码需用到链表结构,正好公共库有关于链表的.第一眼看时,觉得有点新鲜,和我之前见到的链表结构不一样,只有前驱和后继指针,而没有数据域.后来看代码注释发现该代码来自linux内核,在li ...
- python链表的创建_python数据结构之链表的实例讲解
在程序中,经常需要将组(通常是同为某个类型的)数据元素作为整体 管理和使,需要创建这种元素组,变量记录它们,传进传出函数等. 组数据中包含的元素个数可能发变化(可以增加或删除元素). 对于这种需求,最 ...
- Java实现自定义队列和树结构_Java数据结构之链表、栈、队列、树的实现方法示例...
本文实例讲述了java数据结构之链表.栈.队列.树的实现方法.分享给大家供大家参考,具体如下: 最近无意中翻到一本书,闲来无事写几行代码,实现几种常用的数据结构,以备后查. 一.线性表(链表) 1.节 ...
- Python数据结构之链表(linked list)
Python数据结构之链表 一.链表的基本知识 最近在leetcode刷题时遇到了几道关于链表的题,于是恶补了一下关于链表的知识.什么是链表?熟悉python语法的同学肯定都知道list,但是这并不是 ...
- 数据结构之链表创建一元多项式,求一元多项式之和
数据结构之链表创建一元多项式,求一元多项式之和 前言 对于一元多项式,我们完全可以利用线性表P(a0,a1,a2,-,an)表示,这样的线性表在求两个多项式相加等操作时确实简单,但是多于如下的多项式: ...
- (五)数据结构之“链表”
数据结构之"链表" 链表是什么? 数组 vs 链表 JS中的链表 LeetCode:237.删除链表中的节点 LeetCode:206.反转链表 LeetCode:2.两数相加 L ...
- php链表和联表的区别,PHP_浅谈PHP链表数据结构(单链表),链表:是一个有序的列表,但 - phpStudy...
浅谈PHP链表数据结构(单链表) 链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个 ...
最新文章
- mysql和mariadb可以同时使用吗,MariaDB与MySQL在一台服务器同时运行
- python界面颜色怎么改变_pycharm 界面风格修改
- 转-eclipse管理多个workspace
- 【转】EXC_BAD_ACCESS问题在xode4下的调试技巧
- 在SAP ABAP和Hybris Commerce里启动后台作业
- table 合并列_Table.Group相邻的两个数合并案例
- 力扣76,最小覆盖字串(JavaScript)
- excel怎么批量插行_企业开工批量开票怎么办?旭诺教您导入Excel批量开具发票
- python库管理_Python中管理数据库
- 浅谈Redisson底层源码
- 查看linux操作系统版本信息
- 数学分析 反函数存在性定理,连续性定理与求导定理
- 【计量经济学导论】16. 面板数据模型
- 测试人员的工作及介绍
- 捡到的文物应该归谁最好
- 锐捷交换机忘记密码解决方案:恢复出厂设置、重置配置文件
- java方面图形/图像处理
- python处理wrf气象数据_气象编程 | Python3之WRF的投影转换
- 自定义函数 | R语言偏相关分析及绘图
- SELECT FOR ALL ENTRIES IN 通过配置优化速度
热门文章
- 研究人员获得了朝鲜黑客组织使用的命令服务器
- Java实现一个简单的两人五子棋游戏(六) 行棋方变换
- 圆圈中最后剩下的数字(约瑟夫环问题)
- 新版Cloudreve安装并绑定OneDrive
- SpringBoot —— 整合mybatis+微服务注册
- 6个月的大厂 面经,必须点赞!
- i18n 是什么,有什么作用
- PX4多旋翼姿态控制程序分析mc_att_control
- java cron表达式 每天凌晨两点_spring怎么设置定时任务为每天凌晨2点执行和每小时执行一次?...
- JPA使用@Modifying踩坑记录