刚学求助,输入两次数据直接奔溃
#include <stdio.h>#include <string.h>
#include <malloc.h>
typedef struct student
{
long num;
float grad;
struct student *next;
}linklist;
linklist *insert(linklist *head,linklist *p); //按成绩小到大插入到单链表中
linklist *creat(); //创造一个单链表
void output(linklist *head); //输出单链表的数据
void main()
{
linklist *head;
head=creat();
output(head);
}
linklist *creat(void)
{
linklist *head,*p;
long nu;
float gra;
head=NULL;
p=(linklist *)malloc(sizeof(linklist));
printf("请输入学号 成绩:");
scanf("%ld %f",&nu,&gra);
while(nu!=0)
{
p->num=nu;
p->grad=gra;
p->next=NULL;
if(head==NULL)
{
head=p;
}
else
{
head=insert(head,p);
}
printf("请输入学号 成绩:");
p=(linklist *)malloc(sizeof(linklist));
scanf("%ld %f",&nu,&gra);
}
return (head);
}
void output(linklist *head)
{
linklist *p1;
p1=head;
while(p1!=NULL)
{
printf("%ld,%f\n",p1->num,p1->grad);
p1=p1->next;
}
}
linklist *insert(linklist *head,linklist *p)
{
linklist *p1,*p2;
p1=head;
p2=NULL;
while((p1->grad<p->grad)&&(p1->next!=NULL))
{
p2=p1;
p1=p1->next;
}
if(p1->next!=NULL)
{
if(p2==NULL)
{
p->next=head;
head=p;
}
else
{
p->next=p1;
p2->next=p;
}
}
else
{
p2->next=p;
p->next=NULL;
}
return(head); 本帖最后由 lumber2388779 于 2017-4-18 17:34 编辑
else
{
p2->next=p;
p->next=NULL;
}
判断条件是p1->next == NULL但是下边用的是p2指针,p2指针初始值为NULL,这样肯定报错
代码最后少复制了一个} lumber2388779 发表于 2017-4-18 17:31
判断条件是p1->next == NULL但是下边用的是p2指针,p2指针初始值为NULL,这样肯定报错
代码最后少复制 ...
但是我有while给它赋值啊 纯正小白 发表于 2017-4-18 19:28
但是我有while给它赋值啊
while((p1->grad<p->grad)&&(p1->next!=NULL))
这一句视乎你输入的分数才会执行和是否一个节点才会执行的,当你输入1 20 再输入2 30 这条件根本不会符合,即使你输入1 20再输入2 19依旧不会执行,因为这个时候p1->next是NULL,也不符合条件,所以你输入两个数据一定会报错 lumber2388779 发表于 2017-4-18 21:57
while((p1->gradgrad)&&(p1->next!=NULL))
这一句视乎你输入的分数才会执行和是否一个节点才会执行的, ...
ok,谢啦
页:
[1]