|
发表于 2004-3-15 14:11:36
|
显示全部楼层
my opinion:
问题都出在add里
首先head1和head2都应该判空,否则会segmentation fault
在
else if (p2->m>p3->m)
{
p3->next=p1;
p1=p3;
}
这样就会把p3插在了head1的前面,并将p3作为新的头。
但同时有没有更新head1,新插入的p3将丢失。
同时,修改了p3->next,head2被破坏。
楼主应该是想把p3插在p2之前吧
我的做法:
p1记录p2的前一个节点(虽然这样的命名很糟糕),即将
if(p2->m<p3->m)
{
p2=p2->next;
}
改为
if(p2->m<p3->m)
{
p1 = p2 ;
p2=p2->next;
}
将
else if (p2->m>p3->m)
{
p3->next=p1;
p1=p3;
}
改为
else if (p2->m>p3->m)
{
p1 -> next = p3 ;
p1 = p3 ;
p3 = p3 -> next ;
p1 -> next = p2 ;
}
我的add的代码,已测试过了:
- list * add( list * head1, list * head2 )
- {
- if( head1==null || head2==null )
- return null ;
- struct list *p1,*p2,*p3;
- p1=head1;
- p2=head1;
- p3=head2;
- while(p2!=null)
- {
- if(p2->m < p3->m)
- {
- p1 = p2 ;
- p2=p2->next;
- }
- else if (p2->m > p3->m)
- {
- if( p2 == head1 )
- {
- head1 = p3 ;
- p3 = p3->next ;
- head1->next = p2 ;
- }
- else
- {
- p1->next = p3 ;
- p3 = p3->next ;
- p1 = p1->next ;
- p1->next = p2 ;
- }
- }
- else
- {
- p2->n=p2->n+p3->n;
- p3=p3->next;
- }
- if( p3 == null )
- {
- return head1 ;
- }
- }
- p1->next=p3;
- return head1 ;
- }
复制代码
因为可能会修改head1,所以main中调用add要
head1 = add( head1, head2 ) ;
这个add有个很大的缺点,就是head1和head2必须是按指数非递减排序。
因此create也要进行相应修改。
请多多指教 |
|