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

文章展示了如何在C语言中定义和操作链表,包括创建链表节点、插入节点、遍历和释放内存。还提到了一个使用结构体Student表示学生信息的链表例子,用于存储姓名、学号等,并实现了添加学生和打印班级信息的功能。
摘要由CSDN通过智能技术生成

先展示一段代码:

#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 语言中的一种内容,又是数据结构的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值