结构体链表习题详解

小甲鱼习题详解:
题目:根据下面的分析写一程序建立一个含有学生(学号,成绩)数据的单向动态链表。
(约定:我们约定学号不会为零,如果输入的学号为0,则表示建立链表的过程完成,该结点不应连接到链表中)

分析:
1、我们约定学号不会为0,如果输入的学号为0,则表示建立链表的过程完成,该结点不应连接到链表中。
如果输入的p1->num不等于0,则输入的是第一个结点数据(n=1),令head=p1,即把p1的值赋给head,也就是使head也指向新开辟的结点p1所指向的新开辟的结点就成为链表中第一个结点。(p1枪打出头鸟)
(众目睽睽):
在这里插入图片描述

2、再开辟另一个结点并使p1指向它,接着输入该结点的数据。
如果输入的p1->num不等于0,则应链入第2个结点(n=2),将新结点的地址赋给第一个结点的next成员。
接着使p2=p1,也就是使p2指向刚才建立的结点。
在这里插入图片描述

3、再开辟一个结点并使p1指向它,并输入该结点的数据。
在第3次循环中,由于n=3,又将p1的值赋给p2->next,也就是将第3个结点连接到第2个结点之后,并使p2=p1,使p2指向最后一个结点。
在这里插入图片描述

4、再开辟一个新结点,并使p1指向它,并输入该结点的数据。由于p1->num的值为0,不再执行循环,此新结点不应被连接到链表中。
将NULL赋给p2->next。
建立链表过程至此结束,p1最后所指的结点未链入链表中,第3个结点的next成员的值为NULL,它不指向任何结点。
在这里插入图片描述

个人想法:
1、p1的作用是拿来试探输入的“学号”是否为0,若不为0,则会让p2也指向该结点,从而把该结点加入到链表中,若为0,则结束链表的延长(p1是建立空的内存,p2是将上一个内存和新建立的内存相连,形成链表;要循环建立结点的话,必须需要p2)。
2、当我们把学号和成绩输入进仓库后,我们需要输出仓库的数据时,就需要获得每个结点的地址,因此结点之间需要有"next"来连接,即next中存放的是下一个结点的地址。而当读取到"next"为NULL时,循环结束。

源码:

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

#define LEN sizeof(struct student)//student结构的大小 

struct student *creat();          //创建链表 
void print(struct student *head); //打印链表 

struct student
{
	int num;
	float score;
	struct student *next;
}stu;

int n;//全局变量,用来记录存放了多少数据 

void main()
{
	struct student *stu;
	
	stu = creat();
	print(stu);
	
	printf("\n\n");
	system("pause");
}

struct student *creat()
{
	struct student *head;
	struct student *p1,*p2;
	
	p1 = p2 = (struct student *)malloc(LEN);//LEN是student结构的大小 
	
	printf("Pls enter the num :");
	scanf("%d",&p1->num);
	printf("Pls enter the score :");
	scanf("%f",&p1->score);
	
	head = NULL;
	n=0;
	
	while(p1->num)
	{
		n++;
		if(1==n)
		{
			head = p1;
		}
		else
		{
			p2->next = p1;
		}
		
		p2 = p1;
		p1 = (struct student *)(malloc)(LEN);
		
		printf("\nPls enter the num :");
	    scanf("%d",&p1->num);
	    printf("Pls enter the score :");
	    scanf("%f",&p1->score);
	}
	
	p2->next = NULL;
	
	return head;
}

void print(struct student *head)
{
	struct student *p;
	printf("\nThere are %d records!\n\n",n);
	
	p = head;
	if(head)//只要头指针不为0就会执行下去 
	{
		do
		{
			printf("学号为 %d 的成绩是:%f\n",p->num,p->score);
			p=p->next;//这就是next的作用,当我们把学号和成绩输入进仓库后,我们需要调用仓库的数据就需要获得地址,而数据之间需要有"next"来连接 
		}while(p);// 而当读取到"next"为NULL时,循环结束 
	}
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值