链表的合并与排序问题
//书上说可以按升序排序,但是我又没有抄错,所以确定是书上错了,这个程序只能合并链表,无法实现排序#include "stdio.h"
#include "malloc.h"
#define LEN sizeof(struct student)
struct student //定义表头
{long num;
int score;
struct student *next;
};
struct student lista,listb;
int n,sum=0;
void main()
{struct student *creat(void); //声明函数
struct student *insert(struct student *,struct student *); //声明函数
void print(struct student *); //声明函数
struct student *ahead,*bhead,*abh;
printf("input list a: \n");
ahead=creat(); //用creat函数输入链表,存入ahead中
sum=sum+n; //计算有多少个人的数据
printf("input list b: \n");
bhead=creat(); //用creat函数输入链表,存入bhead中
sum=sum+n; //计算有多少个人的数据
abh=insert(ahead,bhead); ////用insert函数将两个表合并。书上说这里还有排序,但是我觉得没有
print(abh); //用print函数输出合并后的链表
}
struct student *creat(void)
{struct student *p1,*p2,*head; //定义变量
n=0;
p1=p2=(struct student *)malloc(LEN); //分配足够的空间给链表,p1,p2指向首地址
printf("input number & scores of student : \n");
printf("if number is 0,stop inputing. \n");
scanf("%ld,%d",&p1->num,&p1->score); //输入数据
head=NULL; //表头为空
while (p1->num!=0) //当输入数不为0时循环
{n=n+1; //计算人数
if(n==1) //如果是第一个元素,则head=p1
head=p1;
else
p2->next=p1; //如果不是第一个元素则p1指向下一个结点
p2=p1;
p1=(struct student *)malloc(LEN); //再次分配一个内存空间
scanf("%ld,%d",&p1->num,&p1->score); //输入数据给p1
}
p2->next=NULL; //循环结束,最后加NULL结束整个链表的输入
return(head); //返回head
}
struct student *insert(struct student *ah,struct student *bh)
{struct student *pa1,*pa2,*pb1,*pb2;
pa2=pa1=ah; //pa1,pa2指向表a的首地址
pb2=pb1=bh; //同上
do
{while ((pb1->num>pa1->num)&&(pa1->next!=NULL))
{pa2=pa1;
pa1=pa1->next; //当条件成立,pa1指向下一个地址
}
if(pb1->num<=pa1->num)
{if(ah==pa1) //这里不怎么懂,应该是如果pa1指向a的表头,那么pb1也指向a的表头吧
ah=pb1;
else pa2->next=pb1;
pb1=pb1->next;
pb2->next=pa1;
pa2=pb2;
pb2=pb1;
}
}
while ((pa1->next!=NULL)||(pa1==NULL&&pb1!=NULL));
if((pb1!=NULL)&&(pb1->num>pa1->num)&&(pa1->next==NULL))
pa1->next=pb1;
return(ah);
}
void print(struct student *head) //输出整个合并后的链表
{struct student *p;
printf("\nThere are %d record: \n",sum);
p=head;
if(p!=NULL)
do
{printf("%ld,%d\n",p->num,p->score);
p=p->next;
}
while (p!=NULL);
}
注释是我自己写的,仅供参考,可能有点不对~~~~~~~~~
问题是无法实现排序问题,希望各位帮忙改一下,谢谢