小甲鱼习题详解:
题目:根据下面的分析写一程序建立一个含有学生(学号,成绩)数据的单向动态链表。
(约定:我们约定学号不会为零,如果输入的学号为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时,循环结束
}
}
运行结果: