#include <stdio.h>
#include <malloc.h>
#define NULL 0
#define LEN sizeof(struct student)
typedef struct student
{int num;
int score;
struct student *next;
}node;
int n,sum=0;
node *create()//建表
{
node *p1,*p2,*head;
n=0;
p2=p1=(node*)malloc(LEN);
head=NULL;
scanf("%d%d",&p1->num,&p1->score);
while(p1->num!=0)
{
n++;
if(n==1) head=p1;
else
p2->next=p1;
p2=p1;
p1=(node*)malloc(LEN);
scanf("%d%d",&p1->num,&p1->score);
}
p2->next=NULL;
return(head);
}
node* insertsort(node *ahead,node *bhead)//插入升序默认排序
{ node *pa1,*pa2,*pb1,*pb2;
pa1=pa2=ahead;
pb1=pb2=bhead;
do
{
while(pb1->num>pa1->num&&pa1->next!=NULL)
{pa2=pa1;pa1=pa1->next;}
if(pb1->num<=pa1->num)
{
if(ahead==pa1)
ahead=pb1;
else pa2->next=pb1;
pb1=pb1->next;
pb2->next=pa1;
pa2=pb2;
pb2=pb1;
}
}while((pa1->next!=NULL&&pb1!=NULL)||(pa1->next==NULL&&pb1!=NULL&&pb1->num<=pa1->num));//
前一个表达式是来判断bhead是否插完了以及ahead是否到了链尾,如果到了就执行后一个表达式,否则断续插)(后一个表达式如果bhead中的值有比ahead链尾的值的值小,则插入,否则跳出)
if((pb1!=NULL)&&(pa1->next==NULL)&&(pb1->num>pa1->num))//这一条件就是用来判断ahead到了链尾,且bhead的当前值比ahead的尾值大,且pb1不是是空指针,则把ahead插入连接到pb1的当前值上.
pa1->next=pb1;
return(ahead);
}
void output(node *head)//输出
{
node *p;
p=head;
if(head!=NULL)
do
{
printf("%d,%d\n",p->num,p->score);
p=p->next;
}while(p!=NULL);
}
void main()
{
node *head1,*head2,*abhead;
printf("input the listone:\n");
head1=create();
sum+=n;
printf("output the list a:\n");
output(head1);
printf("input the listtwo:\n");
head2=create();
sum+=n;
printf("output the list b:\n");
output(head2);
abhead=insertsort(head1,head2);//合并
printf("output the unionlist \n");
output(abhead);
}
我终于解决了这个问题。好开心
这是谭浩强书上一的一道题,但是他的参考程序是错的!!!!
我改了好久才改好了
[此贴子已经被作者于2006-11-28 18:57:37编辑过]