合并后链表输出数目和第二个链表一样
//程序功能:输入若干个学生成绩(输入-1为结束标志),
//建立两个已按升序排序的单向链表,头指针分别为list1、list2,
//把两个链表拼成一个升序排序的新链表,并输出新链表信息。
//要求自定义函数,实现将两个链表拼成一个链表,并返回拼组后的新链表。
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<malloc.h>
struct student{
int num;
char name[10];
int grade;
struct student *next;
};
void mix(struct student *list1,struct student*list2){
struct student *p1,*p2,*p,*l;
int size=sizeof(struct student);
p1=list1->next;
p2=list2->next;
p=(struct student*)malloc(size);
while(p1&&p2){
if(p1->grade<p2->grade){
p->next=p1;
p=p1;
p1=p1->next;
}
else{
p->next=p2;
p=p2;
p2=p2->next;
}
}
if(p1)
p->next = p1;
if(p2)
p->next = p2;
list1->next = NULL;
list2->next = NULL;
printf("合并的人员:\n");
for(l=p;p;l=l->next){
printf("%d %s %d",l->num,l->name,l->grade);
printf("\n");
}
}
int main(){
struct student *list1,*list2,*tail1,*tail2,*p1,*p2;
int num,grade;
char name[10];
int size=sizeof(struct student);
list1=list2=tail1=tail2=NULL;
printf("输入学生学号,姓名,成绩:\n");
scanf("%d",&num);
while(num!=-1){
scanf("%s %d",name,&grade);
p1=(struct student*)malloc(size);
p1->num=num;
strcpy(p1->name,name);
p1->grade=grade;
p1->next=NULL;
if(list1==NULL)
list1=p1;
else
tail1->next=p1;
tail1=p1;
scanf("%d",&num);
}
printf("再次输入学生学号,姓名,成绩:\n");
scanf("%d",&num);
while(num!=-1){
scanf("%s %d",name,&grade);
p2=(struct student*)malloc(size);
p2->num=num;
strcpy(p2->name,name);
p2->grade=grade;
p2->next=NULL;
if(list2==NULL)
list2=p2;
else
tail2->next=p2;
tail2=p2;
scanf("%d",&num);
}
mix(list1,list2);
}
你这代码问题很多啊
1.p1=list1->next; 这里不应该先指向head吗,怎么就直接指向next了,如果链表里一共就一项,你这p1直接指向null了
2.while(p1&&p2)这里应该改为p1||p2,否则不管p1结束了还是p2结束了,就直接结束了