当前位置: 首页 > news >正文

第五十七天学习记录:C语言进阶:结构体链表的自学

先展示一段代码:

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <stdlib.h>// 定义链表节点结构体
typedef struct Node {int value;struct Node* next;
} Node;int main() {// 创建链表头指针Node* head = (Node*)malloc(sizeof(Node));head->value = 1;head->next = NULL;// 向链表中插入新节点Node* current = head;current->next = (Node*)malloc(sizeof(Node));current->next->value = 2;current->next->next = NULL;current = current->next;current->next = (Node*)malloc(sizeof(Node));current->next->value = 3;current->next->next = NULL;// 遍历打印链表current = head;while (current != NULL) {printf("%d ", current->value);current = current->next;}printf("\n");// 释放链表内存(注意要从头节点开始逐个删除)current = head;while (current != NULL) {Node* next = current->next;free(current);current = next;}return 0;
}

在上面的示例中,我们先定义了一个名为Node的结构体来表示链表的每个节点,包括一个整型value和一个指向下一个节点的指针next。接着创建了链表头节点head,并通过修改指针的方式添加了两个新节点。

遍历链表时,同样需要使用一个指针从头节点开始不断沿着链表向后移动,直到遇到一个空指针为止。在删除链表时,同样要记得从头节点开始逐个删除每个节点,并且释放其所占用的内存。

需要注意的是,在C语言中需要手动分配和释放内存,务必确保内存分配和释放的正确性。此外,这只是链式结构使用的一种最基本的示例,在实际应用中还需要考虑和处理其他的情况。

通常情况下,头指针本身不保存任何结构体信息,它只是指向链表中的第一个结点。链表中的每个结点才保存了结构体的具体信息。在遍历链表时,可以使用头指针来获取链表中的第一个结点,然后逐个访问剩余结点。在添加新结构体时,可以使用头指针指向的结点作为链表的起点,并利用指针在其后面追加新的结点,以形成新的链表。因此,头指针对于链式结构的管理是非常重要的。

下面再引用CSDN论坛C语言技能树中的一道题的正确答案,个人觉得这道题也很经典:

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <stdlib.h>typedef struct Student
{char *name;int id;unsigned int age;char group;float score;struct Student *next;
} Student, *M_Class;M_Class init_class()
{M_Class head;head = (Student *)malloc(sizeof(Student));if (!head)return NULL;head->next = NULL;return head;
}void insert_student(M_Class cls, char *name, int id, unsigned int age, char group, float score)
{M_Class p;p = (Student *)malloc(sizeof(Student));p->name = name, p->id = id, p->age = age, p->group = group, p->score = score;p->next = cls->next;cls->next = p;
}void print_class(const M_Class cls)
{M_Class prt = NULL;float total = 0, average = 0;int num_stu = 0;printf("=============== 学生基本信息 ===============\n");printf("姓名\t学号\t年龄\t小组\t成绩\n");printf("--------------------------------------------\n");for (prt = cls->next; prt; prt = prt->next){printf("%s\t%d\t%d\t%c\t%.2f\n",prt->name, prt->id, prt->age, prt->group, prt->score);total += prt->score;++num_stu;}printf("============================================\n");average = total / num_stu;printf("班级平均成绩:%.2f", average);
}int main(int argc, char** argv)
{M_Class cls = init_class();insert_student(cls, "王五", 1003, 16, 'B', 80.50);insert_student(cls, "李四", 1002, 15, 'A', 90.00);insert_student(cls, "张三", 1001, 16, 'A', 95.50);print_class(cls);return 0;
}

这是一个链表程序并使用了 Student 结构体来存储学生的基本信息,其中 next 指针用于连接链表中的各个结点。 M_Class 实际上是 Student* 的别名,它用于声明指向 Student 的指针。

main 函数中,首先使用 init_class 函数来初始化班级链表,然后使用 insert_student 函数向链表中添加新学生。最后使用 print_class 函数打印班级信息,包括学生姓名、学号、年龄、小组和成绩等。

这个程序的输出是:

=============== 学生基本信息 ===============
姓名	学号	年龄	小组	成绩
--------------------------------------------
张三	1001	16	A	95.50
李四	1002	15	A	90.00
王五	1003	16	B	80.50
============================================
班级平均成绩:88.00

从输出结果可以看出,链表中的学生信息被顺序地输出出来了,并且计算了班级平均成绩。

问:
结构体链表算是C语言的内容还是数据结构的内容?
ChatAI答:
结构体链表是数据结构的一种,它是由 struct 标签/结构体作为结点的基本单位组成的一个链式数据结构。每个结点包含结构体中定义的变量以及一个指向下一个结点的指针。结构体链表可以用来表示许多不同的复杂数据结构,例如链表、树、图等。

在 C 语言中,结构体链表通常使用指针来进行创建、操作和使用,因此涉及指针相关的操作。这也使得结构体链表的实现更加灵活,因为它可以动态分配内存来适应不同的需求。由于 C 语言专注于程序的底层细节,因此它非常适合用来实现数据结构,包括结构体链表。因此,结构体链表既是 C 语言中的一种内容,又是数据结构的内容。

相关文章:

第五十七天学习记录:C语言进阶:结构体链表的自学

先展示一段代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h> #include <stdlib.h>// 定义链表节点结构体 typedef struct Node {int value;struct Node* next; } Node;int main() {// 创建链表头指针Node* head (Node*)malloc(sizeof(Node…...

【一次调频】考虑储能电池参与一次调频技术经济模型的容量配置方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

ICV报告: 智能座舱SoC全球市场规模预计2025年突破50亿美元

在智能化、互联化车辆需求不断增加的推动下&#xff0c;汽车行业正在经历一场范式转变。这一转变的前沿之一是智能座舱SoC。本市场研究报告对智能座舱SoC市场进行了全面的分析&#xff0c;包括其应用领域、当前状况和主要行业参与者。 智能座舱SoC指的是现代汽车智能座舱系统的…...

在can协议的基础下编写DBC文件,然后使用该DBC文件下发can协议到底盘完整流程

目录 前言一、VectorCANdb下载及安装二、DBC文件的编写1.新建dbc文件2.建立dbc2.1根据CAN协议设置以下的signals2.2设置报文2.3建立报文与信号的关系2.4建立节点 三、编写程序使用UDP通信下发can协议1.查看can口、电脑ip以及端口号2.编写测试程序 前言 最近完成了一个项目&…...

工业传感器有哪些?

工业传感器是指能在工业制造过程能将感受的力、热、光、磁、声、湿、电、环境等被测量转换成电信号输出的器件与装置&#xff0c;在各种化工、机械、汽车等工业场景上都有应用。 工业传感器有哪些&#xff1f; 工业传感器由于不同的特性也被分为多种不同的类别&#xff0c;主要…...

Docker应用部署之Nginx

部署nginx 要求&#xff1a;在docker容器中部署nginx&#xff0c;并通过外部机器访问nginx 步骤&#xff1a; 1.搜索nginx镜像 docker search nginx 2.拉取nginx镜像 docker pull nginx 3.创建容器 #在root目录下创建nginx目录用于存放nginx项目 mkdir ~/nginx cd ~/ng…...

TerminalWorks TSPrint/TSScan/TSWebCam Crack

/ 远程桌面打印软件&#xff0c;TerminalWorks TSPrint Server/Client 从远程服务器打印到本地打印机的 简单方法 TSPrint 为您提供了一个简单的远程桌面打印软件&#xff0c;以及使 Windows 终端服务操作更容易的附加工具。有选择地启用或禁用功能&#xff0c;以便您可以完全…...

如何使用Springboot实现文件上传和下载,并为其添加实时进度条的功能

文件上传和下载是Web开发中非常基础的功能&#xff0c;但在实际开发中&#xff0c;我们经常需要实时显示文件上传或下载的进度。这篇文章将介绍如何使用Springboot实现文件上传和下载&#xff0c;并为其添加实时进度条的功能。 文件上传 添加Maven依赖项 首先&#xff0c;我…...

安装并新建windows下wxwroks7.0 bootrom工程

双击steup.exe 直接next 直接next 选择typical&#xff0c;然后next I accept 安装完成finish 现在双击Workbench 4&#xff0c;新建vxworks7.0工程&#xff0c;会出现下面的情况&#xff0c;因为没有licence 安装licence&#xff0c;将zwrsLicense-vx7-perm.lic粘贴到安装目…...

element-ui表格el-table的使用

先给大家展示一下效果 Table 属性 属性名说明类型可选值默认值data显示的数据array——heightTable 的高度&#xff0c; 默认为自动高度。 如果 height 为 number 类型&#xff0c;单位 px&#xff1b;如果 height 为 string 类型&#xff0c;则这个高度会设置为 Table 的 sty…...

Backtrader官方中文文档:第八章Indicators指标

本文档参考backtrader官方文档,是官方文档的完整中文翻译,可作为backtrader中文教程、backtrader中文参考手册、backtrader中文开发手册、backtrader入门资料使用。 Indicators指标章节目录 指标(Indicator)指标的使用__init__ 对比 next指标在`__init__`阶段的执行过程指标在…...

CAP原则

CAP原则又称CAP定理&#xff0c;指的是在一个分布式系统中&#xff0c;存在Consistency&#xff08;一致性&#xff09;、Availability&#xff08;可用性&#xff09;、Partition tolerance&#xff08;分区容错性&#xff09;&#xff0c;三者不可同时保证&#xff0c;最多只…...

【PowerQuery】M语言的使用产品和使用场景

当然PowerQuery的M语言应用场景不只是引用在PowerBI和Excel中,它具有广泛的应用场景。目前我们可以在以下产品的使用场景中应用到M语言。 Excel PowerQuery应用Excel通过M语言可以实现整体数据的清洗和重构。  PowerBI 的PowerQuery应用 PowerBI也是通过M语言来实现数据…...

【Linux】遇事不决,可先点灯,LED驱动的进化之路---1

【Linux】遇事不决&#xff0c;可先点灯&#xff0c;LED驱动的进化之路---1 前言&#xff1a; 一、最简单的LED驱动程序 1.1 字符设备驱动程序框架 1.2 程序实战 1.2.1 驱动程序&#xff08;led_drive_simple.c&#xff09; 1.2.2 应用程序&#xff08;led_test_simple.c…...

hive任务reduce步骤卡在99%原因及解决

我们在写sql的时候经常发现读取数据不多&#xff0c;但是代码运行时间异常长的情况&#xff0c;这通常是发生了数据倾斜现象。数据倾斜现象本质上是因为数据中的key分布不均匀&#xff0c;大量的数据集中到了一台或者几台机器上计算&#xff0c;这些数据的计算速度远远低于平均…...

C++11 -- lambda表达式

文章目录 lamaba表达式的引入lambda表达式语法lamabda达式各部分说明捕获列表说明 lamaba表达式底层原理探索 lamaba表达式的引入 在C11之前,如果我们想对自定义类型Goods排序,可以根据姓名,价格,学号按照从大到小或者从小到大的方式排序,可是,这样我们要写额外写6个相关的仿函…...

【开源项目】银行查询服务的设计和实现

银行查询服务的设计和实现 项目地址github&#xff1a;https://github.com/xl-echo/bankInquiryService项目地址gitee&#xff1a;https://gitee.com/xl-echo/bank-inquiry-service 银行查询服务的设计初衷是&#xff1a;为提供更加便利的查询服务&#xff0c;我们在分布式系…...

Linux服务器禁止密码登录,设置秘钥登录

生成SSH密钥 (客户机端) 执行ssh-keygen -t rsa命令创建RSA密钥对&#xff0c;执行结果如下(键入3次回车)&#xff1a; [rootnode01 .ssh]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): [回车] En…...

第十八章 开发Productions - ObjectScript Productions - 通过引用或作为输出传递值

文章目录 第十八章 开发Productions - ObjectScript Productions - 通过引用或作为输出传递值典型的回调方法典型的辅助方法 第十八章 开发Productions - ObjectScript Productions - 通过引用或作为输出传递值典型的回调方法典型的辅助方法 第十八章 开发Productions - Object…...

【云原生|Kubernetes】07-Pod健康检查和服务可用性检查

【云原生|Kubernetes】07-Pod健康检查和服务可用性检查 文章目录 【云原生|Kubernetes】07-Pod健康检查和服务可用性检查前言Pod探针Liveness(Pod存活探针)Readiness(Pod服务就绪探针)Startup(启动探针) 定义Liveness存活探针EXec探针HTTP探针TCP探针gRPC探针使用命名端口 定义…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...