被C语言链表折磨的一天 Σ( △ |||)︴

news/2025/10/18 20:07:10/文章来源:https://www.cnblogs.com/noxaris/p/19147954

OIer竟沦落到这个地步——>C语言课要免修就要拿C语言来写一个链表,而且不能拿数组模拟 ( ̄△ ̄;),为了免修,OIer只好学习一手小小指针。

首先需要知道指针是什么:
int *a char *a[] double *a 以上三个都是指针,前面的数据类型如int只是代表这个指针所指向的数据类型,指针的定义方式可以总结为 数据类型 *指针名 ,可以把指针类型的变量单独看成一种数据类型。定义时前面写的数据类型不会影响其本身类型。也就是说在结构体里面定义一个指向下一个结构体的指针时,会在struct里面出现struct。
如果说把指针比作房卡,那么前面的数据类型就是客人的类型,客人的类型不会影响房卡本身的性质和功能,只是说对于一群客人开不同的房型,不同的房间数量时我们需要提前预留的空间不同 这也是指针和数组模拟的最大区别。指针相对来说更加难以理解但是更加方便快捷。只是需要注意NULL是空指针。用于初始化指针的值,方便后续判断结尾。同时NULL不会指向任何空间也就不会跳到什么奇奇怪怪的地方去。
但其实很多地方和c++的语言逻辑思路没什么区别的,最重要的就是如何使用这个指针变量。本次讲解主要以代码的解读为主。
板子代码里面为指针型变量的有结构体的next指针struct stud *nxt;create函数里面用于指向链表头和链表尾的指针以及指向新节点的指针struct stud *h = nul, *tl = nul, *Node;暂时先看这几个,可以发现,指针类型的变量在使用的时候就可以当成其指向的元素类型来使用,只是需要在最开始的时候定义的时候加入如一个*符号。
那么由此我们总结一下指针型变量的使用————类似于万能房卡的存在,只是每次刷新的房间之前需要将这张房卡的ID改一下,但实际上这张房卡里面并不能住人,可以通过房卡来入住或者退房但是房卡本身只是一个指向性的道具。对应到指针就是,指针在声明过后可以随意指向声明的数据类型的存储空间,也就是说int *a那么a指针就可以指向任何int类型的变量,只要保证每次指针指向的空间所存储的数据是int类型就可以。但是a不能指向其他任何类型的变量。
由此我们来开板子对于指针的使用:
先看一段代码:

struct stud *creat_list() {struct stud *h = nul, *tl = nul, *Node;
//h是head,tl是tail,node是用于新开一个结构体来储存信息
//这些存储的都是地址,不像c++需要下标,这个只需要指向地址
//只能说各有优劣int id;char name[20];double score;char tag;do {scanf("%d %s %lf",&id,name,&score);Node=(struct stud *)malloc(sizeof(struct stud));
//核心出装,给出node一定空间,之后这个节点地址就是现在的nodeNode->ID=id;strcpy(Node->name,name);Node->score=score;Node->nxt=nul;if (h==nul) {//判断开头h=Node;tl=Node;+} else {//接在后面tl->nxt=Node;tl=Node;}printf("y->continue|||||||||||n->stop");scanf(" %c",&tag);} while (tag=='y');return h;//返回一个首地址,知道这个首地址就足够了
}

我们注意到此处的指针使用了一个神奇的符号->,这个符号很神奇,是单独给指针使用的而且还是定向给结构体和类,他的作用是将指针解码并且直接调用箭头后面的元素/函数。举个栗子:
Node->score=score;这段代码其实可以写成(*Node).score=score;也就是说->*这个符号的指针解码为元素和.的调用结合在了一起。在具体书写的时候看个人书写习惯来使用。
如下:

struct stud *creat_list() {struct stud *h = nul, *tl = nul, *Node;int id;char name[20];double score;char tag;do {scanf("%d %s %lf",&id,name,&score);Node=(struct stud *)malloc(sizeof(struct stud));(*Node).ID=id;strcpy((*Node).name,name);(*Node).score=score;(*Node).nxt=nul;if (h==nul) {h=Node;tl=Node;} else {(*tl).nxt=Node;tl=Node;}printf("y->continue|||||||||||n->stop");scanf(" %c",&tag);} while (tag=='y');return h;
}
*/

再然后就是需要注意的一段函数Node=(struct stud *)malloc(sizeof(struct stud));逐步解析这段函数的作用malloc函数的作用就是申请动态开一个大小为一个结构体stud的空间,并且返回这一段空间的首地址。而开头的(struct stud *)则是强制数据类型的转换。将空间分配给一个结构体。
然后其他的都是一些比较细碎的东西,比如冒泡排序和归并算法的一些细节操作。
建议好好复习。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define nul NULL
struct stud {int ID;char name[20];double score;struct stud *nxt;
//此处struct stud是指针指向元素的元素类型
//其实是定义了一个指针而不是在结构体里面定义一个结构体
};
struct stud *creat_list() {struct stud *h = nul, *tl = nul, *Node;
//h是head,tl是tail,node是用于新开一个结构体来储存信息
//这些存储的都是地址,不像c++需要下标,这个只需要指向地址
//只能说各有优劣int id;char name[20];double score;char tag;do {scanf("%d %s %lf",&id,name,&score);Node=(struct stud *)malloc(sizeof(struct stud));
//核心出装,给出node一定空间,之后这个节点地址就是现在的nodeNode->ID=id;strcpy(Node->name,name);Node->score=score;Node->nxt=nul;if (h==nul) {//判断开头h=Node;tl=Node;+} else {//接在后面tl->nxt=Node;tl=Node;}printf("y->continue|||||||||||n->stop");scanf(" %c",&tag);} while (tag=='y');return h;//返回一个首地址,知道这个首地址就足够了
}
/*
struct stud *creat_list() {struct stud *h = nul, *tl = nul, *Node;int id;char name[20];double score;char tag;do {scanf("%d %s %lf",&id,name,&score);Node=(struct stud *)malloc(sizeof(struct stud));(*Node).ID=id;strcpy((*Node).name,name);(*Node).score=score;(*Node).nxt=nul;if (h==nul) {h=Node;tl=Node;} else {(*tl).nxt=Node;tl=Node;}printf("y->continue|||||||||||n->stop");scanf(" %c",&tag);} while (tag=='y');return h;
}
*/void sort_list(struct stud*h) {if(h==nul||h->nxt==nul) {return ;}int tag;struct stud *nowp;struct stud *lptr=nul;int	ListId;char Listname[20];double Listscore;do {tag=0;nowp=h;while(nowp->nxt!=lptr) {if(nowp->score<nowp->nxt->score) {ListId=nowp->ID;nowp->ID=nowp->nxt->ID;nowp->nxt->ID=ListId;strcpy(Listname,nowp->name);strcpy(nowp->name,nowp->nxt->name);strcpy(nowp->nxt->name,Listname);Listscore=nowp->score;nowp->score=nowp->nxt->score;nowp->nxt->score=Listscore;tag=1;}nowp=nowp->nxt;}lptr=nowp;} while(tag);
}
struct stud  *Merge_list(struct stud *lsta,struct stud *lstb) {if(lsta==nul)return lstb;if(lstb==nul)return lsta;struct stud *h=nul, *tl=nul;struct stud *Lista=lsta, *Listb=lstb;if(Lista->score>=Listb->score) {h=Lista;Lista=Lista->nxt;} else {h=Listb;Listb=Listb->nxt;}tl=h;while(Lista!=nul&&Listb!=nul) {if(Lista->score>=Listb->score) {tl->nxt=Lista;Lista=Lista->nxt;} else {tl->nxt=Listb;Listb=Listb->nxt;}tl=tl->nxt;}if(Lista!=nul) {tl->nxt=Lista;} else {tl->nxt=Listb;}return h;
}void print_list(struct stud *List) {struct stud *h=List;while(h!=nul) {printf("ID:%d\t Name:%s\t Score%.2lf\n",h->ID,h->name,h->score);h=h->nxt;}return ;
}
int main(void) {printf("List1 ----------->\n");printf("Id/name/score\n");struct stud *lista=creat_list();printf("List2 ----------->\n");printf("Id/name/score\n");struct stud *listb=creat_list();sort_list(lista);print_list(lista);sort_list(listb);print_list(listb);struct stud *listc=Merge_list(lista,listb);print_list(listc);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/939748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebGL学习及项目实战(第03期:绘制多个点,线,面)

@目录目标WebGL原理示意图着色器代码顶点着色器代码解析片元着色器代码解析js代码初始化WebGL代码初始化shaders代码创建着色器对象创建程序对象初始化buffers代码绘制代码代码总结绘制多个点完整代码初始化缓冲区绘制…

ozon定制尺寸和重量

ozon定制尺寸和重量VVV---A888---KKK

CF 359D. Pair of Numbers

D.Pair of Numbers原题链接 题意简述西蒙有一个数组 \(a_1, a_2, ..., a_n\) ,由 n 个正整数组成。今天,西蒙要求你找出一对整数 $l, r (1 \leq l \leq r \leq n) $,使得下列条件成立: 有整数 \(j ( l …

2025多校CSP模拟赛6

T1:最长不下降子序列 (sequence) 思路: 依据做传统最长不下降子序列的的经验,这题用 \(dp\) 。 因为 \(a\) 的值只有 \(1,2\) ,并且翻转操作只进行一次,所以我们考虑什么样的情况一次翻转能产生最长不下降子序列呢…

Java基础——类型转换,变量、常亮、作用域,基本运算符

Java基础——类型转换,变量、常亮、作用域,基本运算符类型转换 从低到高--------------> byte,short,char-->int-->long-->float-->double (小数优先级高于整数) 运算过程中需要将不同类型的值转换…

洛谷 LGR-246 S 模拟赛

100 + 0 + 44 + 24 = 168, Rank 469/3708.下次再也不在过掉了一个题的情况下试图去想第二个题的正解了 /ll【LGR-246】SCP 2025 第二轮(复赛 S 组)模拟 链接:link 题解:题目题解区内 时间:4h (2025.10.18 14:30~1…

godot3D节点本身的偏转数值错误竟会导致空间移动穿模??!

在Godot引擎中,当RigidBody3D节点被施加一个异常扭矩值apply_torque((-inf,inf,-inf))时,即使不会导致物体实际旋转,也会引发异常物理行为:物体在空间线性力或自由落体作用下会匀速穿模。测试表明,RigidBody3D的姿…

Kafka面试精讲 Day 24:Spring Kafka构建实战

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

重新安装trea cn

重新安装trea cnhttps://blog.csdn.net/weixin_45417754/article/details/149644689

题解:qoj7938 Graph Race

简单题。 题意:给出一张图,边权为 \(1\),每个点有属性 \(a,b\),定义一个点 \(u\) 的权值 \(f(u)\) 为 \(\max _{u\not=v}a_v-b_v\operatorname{dis}(u,v)\),按从小到大的顺序输出与 \(1\) 相连的的点的 \(f\) 值。…

java中的初等函数

java中的初等函数一、函数 基本初等函数:基本初等函数是指常值函数、幂函数、指数函数,对数函数、三角函数、反三角函数这六类函数。 初等函数:将由基本初等函数经过有限次加、减、乘、除四则运算和有限次复合运算所…

【机器人】SG-Nav 分层思维链H-CoT | 在线分层3D场景图 | 目标导航 - 教程

【机器人】SG-Nav 分层思维链H-CoT | 在线分层3D场景图 | 目标导航 - 教程2025-10-18 19:28 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: …

Dr. Jane Goodall

Dr. Jane Goodallwhen I was in gomi particularly I felt very very close to a great spiritual [Music] power if we think of the Bible it would be in which we live and move and have our being and I felt th…

专用硬件神经网络优化技术解析

本文深入探讨了针对专用硬件优化神经网络架构的技术方案,通过优化搜索空间设计和结合专家经验,在多个实际应用中实现了高达55%的延迟降低,涵盖了检测模型、分类模型和语义分割等具体应用场景。专用硬件神经网络优化…

学习逆向的背景知识(自用)

学习逆向的背景知识(自用) 常见的寄存器指令指针(程序计数器) IP EIP RIP 寄存下一个指令的地址通用寄存器:累加器寄存器 EAX RAX 寄存算术运算结果基址寄存器 EBX RBX 寄存引用偏移量的基址…

Linux-网络安全私房菜(二)

Linux-网络安全私房菜(二)目录防火墙防火墙简单操作iptablestips建议系统资源篇章理解数据流输出重定向stress压力测试命令free命令netstat命令ss命令软件包篇章rpm包管理dpkg包管理磁盘篇章MBRfdiskGPT(GUID)gdiskpar…

pycharm使用远程的ssh的解释器

今天使用了远程ssh的解释器1.使用 专业版本的pycharm 2. 3. 解释器使用 .conda/envs/.../lth/python.exe 4. 5. 如果你有一些数据集也在这附近,需要把数据集 exclude掉 总的来说, 这么做就够了。 可惜我老师只有…

Android SSL Pinning检测利器:SSLPinDetect技术解析

本文详细介绍了SSLPinDetect工具的技术原理和实现,这是一个用于Android应用安全分析的SSL Pinning检测工具,通过多线程扫描、内存映射读取和预编译正则表达式等技术,实现高效的静态代码分析。SSLPinDetect:Android…

AI元人文:社区调解的数字剧场

AI元人文:社区调解的数字剧场 在AI元人文的视野下,社区调解经历了一场深刻的范式转变——从对错的裁判转变为多方价值诉求在特定情境舞台上的创造性对话。这不仅是方法的升级,更是对调解本质的重新定义。 一、从对抗…

2025年粉末冶金制品/零件厂家推荐排行榜,专业制造与高品质服务的首选!

2025年粉末冶金制品/零件厂家推荐排行榜,专业制造与高品质服务的首选!随着工业技术的不断进步和市场需求的多样化,粉末冶金制品及零件在各个领域的应用越来越广泛。为了帮助采购决策者筛选出优质的粉末冶金制品及零…