我写的一个删除链表结点的函数,求帮忙看下是否正确
[code=C/C++][struct thing *del2(struct thing *head)
{
struct thing *p3,*p4;
p3=head;
p4=head;
while(p3!=NULL)
{
if((strcmp(delname,p3->nam))==0)
{
if(p3==head)
{
head=p3->next;
p4=head;
}
else
p4->next=p3->next;
p3=p3->next;
}
else
{
p4=p3;
p3=p3->next;
}
}
return(head);
}/code]
上面是我个人写的一个删除链表结点的函数,delname是全局变量,大家就帮我看下有没有漏了其它情况就行了,我自己改了很多次,每次都有问题,要不是当要删除的链表结点在第一个时出问题,就是无法删除相同的结点,这个是我改了多次后的代码,但是我不敢保证它是真的包括了所有情况,所以来问一下大家。。。。
[解决办法]
http://topic.csdn.net/u/20111226/22/640e5f4f-648d-4600-bd5c-f8f964168542.html
[解决办法]
代码本身没发现明显错误,你的del2函数会删除传给它的链表中所有nam项与delname相同的节点,并返回指向删除后链表头部的指针。调用者要注意用返回值更新该链表的头指针,否则有可能出现错误。
不过,struct thing *del2(struct thing *head)这样的写法太罕见了。让人很迷惑。
另外,一般情况下你可以用引用参数来回传头指针,而不用返回值。用引用传递的话,你可以在del函数里改变头指针的值,就不用在调用后重新给它赋值了。在外面重新赋值容易忘掉,而在函数内就算忘掉了也更容易发现问题。
此外,你的缩进格式不对,代码不好看。看看正常情况下的缩进:
- C/C++ code
struct thing *del2(struct thing *head){ struct thing *p3,*p4; p3=head; p4=head; while(p3!=NULL) { if((strcmp(delname,p3->name))==0) { if(p3==head) { head=p3->next; p4=head; } else p4->next=p3->next; p3=p3->next; } else { p4=p3; p3=p3->next; } } return(head);}
[解决办法]
一共就三种状况:
空表:这个可以被while(p3!=NULL)解决
头节点匹配:这个有if(p3==head)处理
其它节点匹配:这个有else p4->next=p3->next;处理