一个疑问!请各位大侠帮帮忙!有分送!

时间:2021-05-29 19:56:19
分别建立两个按学号升序排列的链表,每个链表中的结点包括学号、成绩,要求把两个链表合并成一个链表,并按学号升序排列输出!以下是本人的程序:

#include <stdio.h>
#define M 4
#define N 4

typedef struct student        /*定义学生结点*/
{int num;
int score;
struct student *next;
}student;

input(student *stu,int n)     /*输入并建立链表的函数*/
{int i;
student *p,*q=stu;
for(i=1;i<=n;i++)
{printf("请输入第%d个学生资料:\n",i);
p=(student*)malloc(sizeof(student));
scanf("%d %d",&p->num,&p->score);
p->next=NULL;
if(q==NULL)q=p;
else {q->next=p;q=p;}
}
}

print(student *stu)                    /*输出链表的函数*/
{student *p=stu->next;
while(p){
printf("%d %d\n",p->num,p->score);
p=p->next;}
}

main()                                    /*主函数*/
{
student *stu1=(student*)malloc(sizeof(student)*M);
student *stu2=(student*)malloc(sizeof(student)*N);
student *p=NULL;
student *q=NULL;
student *x=NULL;
student *y=NULL;

puts("请输入第一组学生的资料:");
putchar('\n');
input(stu1,M);
putchar('\n');

puts("请输入第二组学生的资料:");
putchar('\n');
input(stu2,N);
putchar('\n');

puts("第一组学生的资料:");
print(stu1);
putchar('\n');

puts("第二组学生的资料:");
print(stu2);
putchar('\n');

p=stu1;
q=stu2;

while(p->next!=NULL&&q->next!=NULL)    /*实现合并*/
{if(q->next->num<=p->next->num)
{x=p->next;
p->next=q->next;
y=q->next->next;
q->next->next=x;
p=p->next;
q->next=y;
}
 else p=p->next;
}

if(q->next!=NULL)p->next->next=q->next;

print(stu1);             /*输出合并后链表*/
}

在TC2.0下面编译成功,运行后输入数据测试,输入某些数据后,会出现合并后链表输出不完整,只输出前6名学生的数据,后面紧接着输出如下字符:
Null pointer assignment .(没有分配指针)

请各位大侠帮帮忙!多多指教!有分送!

6 个解决方案

#1


up

#2


student *p=stu->next;//student *p=stu;为什么要等于stu->next
                   和下面的有点矛盾
for(i=1;i<=n;i++)
{printf("请输入第%d个学生资料:\n",i);
p=(student*)malloc(sizeof(student));
scanf("%d %d",&p->num,&p->score);
p->next=NULL;
if(q==NULL)q=p;
else {q->next=p;q=p;}
         p=NULL;//这里有点问题,不一定是主要的
}


#3


/*实现合并*/
while ()
{if () {
      ....
      q->next=y; //改为q = y;试试看
}
else
....


同时我认为stu1与stu2好像没有作比较

#4


推荐stl
再不用自己写链表

#5


还要注意,用了的内存一定要释放

#6


student *stu1=(student*)malloc(sizeof(student)*M);
student *stu2=(student*)malloc(sizeof(student)*N);
这里为stu1&stu2申请了sizeof(student)*N大小的空间
但是在input()里面,又有:p=(student*)malloc(sizeof(student));
等于把stu2当成首指针。也就是说,在它里面的东西不过有sizeof(student)大小,有sizeof(student)*M-sizeof(student)浪费了!
(可惜可惜):)
如果是我,我就把stu1,stu2命名成head1,head2
因为他们是起首指针的作用,并不是存储整个链表!




#1


up

#2


student *p=stu->next;//student *p=stu;为什么要等于stu->next
                   和下面的有点矛盾
for(i=1;i<=n;i++)
{printf("请输入第%d个学生资料:\n",i);
p=(student*)malloc(sizeof(student));
scanf("%d %d",&p->num,&p->score);
p->next=NULL;
if(q==NULL)q=p;
else {q->next=p;q=p;}
         p=NULL;//这里有点问题,不一定是主要的
}


#3


/*实现合并*/
while ()
{if () {
      ....
      q->next=y; //改为q = y;试试看
}
else
....


同时我认为stu1与stu2好像没有作比较

#4


推荐stl
再不用自己写链表

#5


还要注意,用了的内存一定要释放

#6


student *stu1=(student*)malloc(sizeof(student)*M);
student *stu2=(student*)malloc(sizeof(student)*N);
这里为stu1&stu2申请了sizeof(student)*N大小的空间
但是在input()里面,又有:p=(student*)malloc(sizeof(student));
等于把stu2当成首指针。也就是说,在它里面的东西不过有sizeof(student)大小,有sizeof(student)*M-sizeof(student)浪费了!
(可惜可惜):)
如果是我,我就把stu1,stu2命名成head1,head2
因为他们是起首指针的作用,并不是存储整个链表!