问题描述
我们要在动态建立链表时空间才不会被浪费,每增加一个节点数据就动态为他分配一个空间,然后插入到主链表中,最后输出链表
代码解决
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(Student)//定义一个结构体的大小,因为每次分配一个节点的大小
typedef struct Student{
int num;
float score;
struct Student *next;
}Student;
//返回结构体类型的
Student *create(){//括号里面可以写void
Student *head;
Student *p1,*p2;//链表我就创建的2个指针,也可以创建2个stu_1,stu_2然后指针指向他们俩的地址
int n=0;
p1=p2=(Student*)malloc(LEN);//分配空间给新建的2节点
scanf("%ld,%f",&p1->num,&p1->score);
head=NULL;//初始化链表
while(p1->num!=0){//怕p1这个节点的值不为0,那就把他加入到p2的这个主链表中
n=n+1;//p2的长度+1
if(n==1){//初始化head,把p1的值给head (head实际上就是p2的头结点)
head=p1;//不可以省略,head的位置很重要,需要通过它遍历 ,这里是把p1的位置给head了的
}else{//否则就直接连接到p2后
p2->next=p1;
}
p2=p1;//p1的当前位置给p2(其实第一轮这个时候p2和head都是在一个地方也就是p1的位置,第二轮的时候p2就是跟着p1走了,head还在第一个分配p1的那个,并且连成了长长的链表)
p1=(Student*)malloc(LEN);//重新为p1分配空间,走else了
scanf("%d,%f",&p1->num,&p1->score);
}
p2->next=NULL;//要把链表为指向空结束链表,不然会输出很多地址
return head; //return链表头的地址即可,而非p2
}
int main()
{
Student *p;//定义指针结构体
p=create();//函数会得到链表的第一个节点
//在此,我们不像86那样遍历输出,只输出第一个节点的值检验动态链表是否建立成功
//printf("%d %f",p->num,p->score);
//或者遍历输出才看得到后面是否出现问题
do{
printf("学号:%d成绩:%.1f\n",p->num,p->score);
p=p->next;
}while(p!=NULL);
}