题目:两个有序链表的归并。
解决方案:
#include "stdlib.h"
#define Integer struct integer
#define length sizeof(struct integer)
#define null 0
Integer{int value;Integer *next;};
main(){
Integer *headA,*headB,*headC,*pa,*pb,*pc,*new;
int n=10,m=10;
/*建立有序链表A,这里长度为10*/
while(n){
new=(Integer *) malloc(length);
if (n==10) {headA=new;pa=new;}
else{
pa->next=new;
pa=new;
}
new->value=(int)rand()%100+100*(10-n);/*保证生成一个有序链表*/
n--;
}
pa->next=null;
/*输出链表A*/
pa=headA;
while(pa){
printf("%4d",pa->value);
pa=pa->next;
}
printf("/n");
/*建立有序链表B,这里长度为10*/
while(m){
new=(Integer *) malloc(length);
if (m==10) {headB=new;pb=new;}
else{
pb->next=new;
pb=new;
}
new->value=(int)rand()%100+100*(10-m);/*保证生成一个有序链表*/
m--;
}
pb->next=null;
/*输出链表B*/
pb=headB;
while(pb){
printf("%4d",pb->value);
pb=pb->next;
}
printf("/n");
/*归并两个有序链表C*/
pa=headA;
pb=headB;
pc=headC=(Integer *) malloc(length);/*归并后链表C的头结点,建立头结点方便处理*/
while(pa&&pb){
if (pa->value<=pb->value)
{pc->next=pa;pc=pa;pa=pa->next;}
else
{pc->next=pb;pc=pb;pb=pb->next;}
}
pc->next=(pa!=null?pa:pb);/*总有一个先为空的,pa或pb谁先为空,说明谁先到头,指向另外一个接上*/
/*输出链表C,从第一个结点开始*/
pc=headC->next;
free(headC);/*不喜欢头结点所以删除*/
headC=pc;/*headC指向第一个结点*/
while(pc){
printf("%4d",pc->value);
pc=pc->next;
}
printf("/n");
}