C语言删除两条单链表相同的元素?
List*List_Delete(List*head1,List*head2){List*p,*q,*s;p=head1;while(p->next!=NULL){q=h...
List *List_Delete(List *head1,List *head2)
{
List *p,*q,*s;
p=head1;
while(p->next!=NULL){
q=head2;
while(q!=NULL){
if(p->data==q->data)
if(q==head2)
head2=q->next;
else{
s=q->next;
q->next=s->next;
free(s);
}
q=q->next;
}
p=p->next;
}
p->next=head2;
return head1;
}
外层循环为什么不能是while(p!=NULL)呢????这样的话只能遍历到第一个链表的倒数第二个元素 展开
{
List *p,*q,*s;
p=head1;
while(p->next!=NULL){
q=head2;
while(q!=NULL){
if(p->data==q->data)
if(q==head2)
head2=q->next;
else{
s=q->next;
q->next=s->next;
free(s);
}
q=q->next;
}
p=p->next;
}
p->next=head2;
return head1;
}
外层循环为什么不能是while(p!=NULL)呢????这样的话只能遍历到第一个链表的倒数第二个元素 展开
展开全部
p!=NULL这个判断p指针是否为空的语句是必须的,但是该函数中并没有p!=NULL的判断,因为p为空的话那么程序就无法从内存中取出p->next,所以如果参数head1为空的话,程序会强制中断并报错。并且外循环的末尾p=p->next正好能和while(p!=NULL)对应,因此我个人认为外层循环可以是while(p!=NULL)。
追问
我也是这么认为的,可是运行的时候会出错。。。很迷茫。。。
追答
是因为函数的末尾部分有p->next=head2;吧,如果写while(p!=NULL)的话,那么当p==NULL的时候循环才会终止,此时p==NULL自然就不存在p->next了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询