#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;//这里有点问题,不一定是主要的
}
和下面的有点矛盾
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好像没有作比较
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
因为他们是起首指针的作用,并不是存储整个链表!
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;//这里有点问题,不一定是主要的
}
和下面的有点矛盾
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好像没有作比较
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
因为他们是起首指针的作用,并不是存储整个链表!
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
因为他们是起首指针的作用,并不是存储整个链表!