当前位置: 首页 > 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 语言中的一种内容,又是数据结构的内容。

http://www.lryc.cn/news/90952.html

相关文章:

  • 【一次调频】考虑储能电池参与一次调频技术经济模型的容量配置方法(Matlab代码实现)
  • ICV报告: 智能座舱SoC全球市场规模预计2025年突破50亿美元
  • 在can协议的基础下编写DBC文件,然后使用该DBC文件下发can协议到底盘完整流程
  • 工业传感器有哪些?
  • Docker应用部署之Nginx
  • TerminalWorks TSPrint/TSScan/TSWebCam Crack
  • 如何使用Springboot实现文件上传和下载,并为其添加实时进度条的功能
  • 安装并新建windows下wxwroks7.0 bootrom工程
  • element-ui表格el-table的使用
  • Backtrader官方中文文档:第八章Indicators指标
  • CAP原则
  • 【PowerQuery】M语言的使用产品和使用场景
  • 【Linux】遇事不决,可先点灯,LED驱动的进化之路---1
  • hive任务reduce步骤卡在99%原因及解决
  • C++11 -- lambda表达式
  • 【开源项目】银行查询服务的设计和实现
  • Linux服务器禁止密码登录,设置秘钥登录
  • 第十八章 开发Productions - ObjectScript Productions - 通过引用或作为输出传递值
  • 【云原生|Kubernetes】07-Pod健康检查和服务可用性检查
  • jeecgboot使用的问题记录
  • 【C++】数组 - 一维数组,二维数组
  • 前端:使用rollup的简单记录
  • 基于flask的web应用开发——接受post请求
  • Linux源码包的安装与升级
  • 电子合同签署协议开源版系统开发
  • 【每日一题Day221】LC2455可被三整除的偶数的平均值 | 模拟
  • NCI架构-1
  • lambda使用场景
  • Python模拟Postgres数据库连接
  • (转载)基于粒子群算法的多目标搜索算法(matlab实现)