链表嵌套链表学习 之 学生管理系统

在这里插入图片描述

大家好,我是 杰哥编程

链表嵌套链表学习 之 学生管理系统

这篇博客的目的就是为了水,搞错了。。。
线下线上很多同学学完链表要做
两个基于链表嵌套链表的
学生管理系统和贪吃蛇小游戏项目
但是很多小伙伴理解不了什么是链表嵌套
特地写一篇文章说一说。
其实就是一句话的事,
但总不能一篇博客就为了说这句话吧
所以顺带剽了线下班一位小伙伴的源码过来讲解一下
简单朴素,不花里胡哨的那种

链表嵌套链表

所以什么是链表嵌套链表
首先要知道什么是链表?根据链表的定义,结合代码解释链表嵌套

链表

天书中这般说到:
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。因此,为了表示每个数据元素Ai与其直接后续数据元素Ai+1之间的逻辑关系,对数据元素Ai来说,除了存储器本身的信息之外,还需要存储一个指示其直接后继的信息(即直后继的存储位置)。这两部分信息组成数据元素Ai的存储映像,称为结点(node)。他包括两个域:其中存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域.指针域中存储的信息称做指针。n个结点(Ai(1<=i<=n)的存储映像)链结成一个链表,即为线性表
( a 1 , a 2 , . . . , a n ) (a_1,a_2,...,a_n) (a1,a2,...,an)
的链式存储结构。又由于此链表的每个结点中只包含一个指针域,故又称线性链表或单链表。

链表嵌套

根据链表的定义,一个结点中包含一个指针域和一个数据域,指针域指向另一个与自身数据想同的另一结点,往复于此,称为链表。
而链表嵌套链表,从字面意思可知是链表中包含了链表,链表的单位表现形式又是结点,所以链表要嵌套链表,只能在结点中做文章。
实际上就是在数据域中增加另一种存储器的链表结点。

上代码:

struct Class{
	int banji;//班级号
	struct Student *Shead;//班级的第一个学生。
	struct Class *next;
};
struct Student{
	char name[20];
	struct Student *next;
};

这是两个结构体,分别代表学生管理系统中的班级和学生数据结构。
由他两来扮演链表中的两种不同数据类型的结点。
可见班级结构体中最后一个指针成员指向的是同样数据类型的班级结构体,所以当创建多个班级,并用第三个成员连接起来后,便形成班级节点。
而班级中需要多个学生,所以可以在每个班级内都创建一个学生链表,并把学生的头结点地址存储在班级结点中。
完美实现链表嵌套链表。

学生管理系统

让我们一起看看线下班学生实现的学生管理系统
选他不是因为他做的多好,代码多牛逼,功能多完善
就是简单明了 代码量少。好解释

/*******************************************
函数名称:
    初始化班级
功能描述:
    根据班级内学生数量开辟结构体指针空间,
    并初始化学生信息,
    这里只保留了学生名字的代码,
    最后连成链表。
参数:
    xuesheng:学生数量
返回:
    当前班级的学生链表头结点
*******************************************/
struct Student *initStudent(int xuesheng)
{
	struct Student *new;
	struct Student *Shead=NULL;

	while(xuesheng)
	{
		putchar('\n');
		new=(struct Student*)malloc(sizeof(struct Student));
		new->next=NULL;
		
		printf("请输入学生的名字\n");
		scanf("%s",&(new->name));
		
		if(Shead==NULL)
		{
			Shead=new;
		}
		else
		{
			struct Student *p;
			p=Shead;
			while(p->next!=NULL)
			{
				p=p->next;
			}
			p->next=new;
		}
		xuesheng--;
	}
	putchar('\n');
	return Shead;
}

/*******************************************
函数名称:
    初始化班级
功能描述:
    根据班级数量开辟结构体指针空间,
    随即初始化当前班级内的学生信息链表
    最后依次连接班级形成链表
参数:
    banji:班级数量
    xuesheng:学生数量
    Chead:班级链表头结点
返回:
    当前班级的学生链表头结点
*******************************************/
struct Class *initClass(int banji,int xuesheng,struct Class *Chead)
{
	struct Class *new;
	while(banji)
	{
		new=(struct Class*)malloc(sizeof(struct Class));
		new->next=NULL;
		new->Shead=NULL;
		
		putchar('\n');
		printf("请输入班级号:\n");
		scanf("%d",&(new->banji));
		getchar();
		new->Shead=initStudent(xuesheng);//套用初始化学生成绩的函数实现一个班五个学生。
		
		if(Chead==NULL)
		{
			Chead=new;
		}
		else
		{
			struct Class *p;
			p=Chead;
			while(p->next!=NULL)
			{
				p=p->next;
			}
			p->next=new;
		}
		banji--;
	}
	return Chead;
	
}

over 高兴

不是什么技术博文,玻璃心 不要喷我。
因为工作需要写的。
然后补充一个水这篇博客的原因:
度娘搜下去,一篇解释嵌套链表的博客都没找到,
全是学生管理系统,我服了,
独乐乐不如众乐乐,我也加入!!!

本次分享到此为止,如有问题欢迎各位指出!!!

最近又忙又懒,之前的几个其他系列的博客停了好久,

我知道你很急,但是你先不要急

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值