有序单链表合并(原结点) 有个问题,请高手指教!
#include<stdlib.h>#include<stdio.h>
#define ST struct a
ST //声明结构体
{ int num;
ST *next;
};
ST *ceart() //创建链表
{ ST *head,*p1,*p2;
int n=0;
p1=p2=(ST *)malloc(sizeof(ST));
printf("input is:\n");
scanf("%d",&p1->num);
while(p1->num!=0)
{ n++;
if( n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(ST *)malloc(sizeof(ST));
scanf("%d",&p1->num);
}
p2->next=NULL;
free(p1);
return head;
}
ST *print(ST *h) //输出
{
while(h!=NULL)
{
printf("%d ",h->num);
h=h->next;
}
}
ST *link(ST *L1,ST *L2) //合并链表
{ ST *p1,*p2,*p3,*head;
head=p3=L1;
p1=L1->next;
p2=L2->next;
while(p1&&p2)
{ if(p1->num<=p2->num)
{ p3->next=p1; p3=p1; p1=p1->next; }
else
{ p3->next=p2; p3=p2; p2=p2->next; }
}
p3->next=p1?p1:p2;
return head;
}
main()
{ ST *h1,*h2,*head; clrscr();
h1=ceart();
h2=ceart();
head=link(h1,h2);
print(head);
}
我是按书上分析写的,但这个存在一个问题:
两个表合并之后,第二个表(L2所指)的第一个结点的数据合并不上去.
例如: 输入: 5 9 14 0
输入: 6 11 16 0
输出:5 9 11 14 16
不知道哪个位置有问题,请高手赐教!.
----------------解决方案--------------------------------------------------------
在线等答案....
----------------解决方案--------------------------------------------------------
ST *link(ST *L1,ST *L2) //合并链表
{ ST *p1,*p2,*p3,*head;
head=p3=L1;
p1=L1->next;
p2=L2->next; 此处修改为:p2=L2;
{ if(p1->num<=p2->num)
{ p3->next=p1; p3=p1; p1=p1->next; }
else
{ p3->next=p2; p3=p2; p2=p2->next; }
}
p3->next=p1?p1:p2;
return head;
}
----------------解决方案--------------------------------------------------------
我刚刚也想出来了..
但是这样还是存在一个问题..
要选用哪个链表的头作为合并后的链表头,
就需要比较两个链表的头结点数据的大小..
我修改了一下,加了个if .. else ....
ST *link(ST *L1,ST *L2)
{ ST *p1,*p2,*p3,*head;
if(L1->num<=L2->num)
{ head=p3=L1;
p1=L1->next;
p2=L2; }
else
{ head=p3=L2;
p1=L1;
p2=L2->next;
}
while(p1&&p2)
{ if(p1->num<=p2->num)
{ p3->next=p1; p3=p1; p1=p1->next; }
else
{ p3->next=p2; p3=p2; p2=p2->next; }
}
p3->next=p1?p1:p2;
return head;
}
这样就比较完美了..
想了一上午的问题终于想出来了..
对链表合并的程序有所理解了..
感谢本贴的回答者..
我是今天刚进的论坛,
以后请多指教..
----------------解决方案--------------------------------------------------------
记得释放不用的节点啊!
----------------解决方案--------------------------------------------------------