动态链表入门必做题目,问题发现了,高手来解释下
源程序如如下:#include "stdio.h"
#include "malloc.h"
#define null 0
#define len sizeof(struct student)
struct student /*定义结构体*/
{long num; float score;struct student *next;};
int n;
struct student *creat(void)/*定义建立动态链表的函数*/
{ struct student *head;
struct student *p1,*p2;
n=0;
p1=p2=(struct student *)malloc(len);
printf("please input the student's date:\n");
scanf("%ld,%f",&p1->num,&p1->score);
while(p1->num!=0)
{n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student *)malloc(len);
scanf("%ld,%f",&p1->num,&p1->score);
}
p2->next=null;
return(head);
}
main()
{struct student *head;
head=creat();
}
1)、当以(数据1,数据2)格式输入时,系统报错。
2)、当以空格代替数据1、2之间的逗号,形如(数据1 数据2)输入,运行正常。
而如果把源程序中的语句scanf("%ld,%f",&p1->num,&p1->score);改为 scanf("%ld %f",&p1->num,&p1->score);用以上第1种格式输入运行正常,第2种格式输入系统报错。
而如果把源程序中num 和score变量都定为长整形或浮点型,总之要定为一样的变量类型。当输入语句为scanf("%ld,%f",&p1->num,&p1->score);时不管以1、2哪种格式输入都运行正常。当输入语句为scanf("%ld %f",&p1->num,&p1->score);时,只能以第2种格式输入,第一种格式输入时,无法输入,但系统也不报错。
在一般情况下,如以下2个程序:
/*程序1*/
#include "stdio.h"
main()
{
int a ,b,c;
printf("please input date:\n");
scanf("%d,%d,%d",&a,&b,&c);
printf("%d,%d,%d",a,b,c);
}
必须以“,”号分隔输入数据
/*程序2*/
#include "stdio.h"
main()
{
int a ,b,c;
printf("please input date:\n");
scanf("%d %d %d",&a,&b,&c);/*#空格代替逗号*/
printf("%d,%d,%d",a,b,c);
}
必须以空格分隔输入数据。
也就是说在上面2个程序中输入格式必须与scanf中的一致。
但是这个动态链表,怎么会出现这样的情况呢,真搞不懂啊