读书人

小弟我写的一个删除链表结点的函数求

发布时间: 2012-04-08 14:38:30 作者: rapoo

我写的一个删除链表结点的函数,求帮忙看下是否正确
[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;处理

读书人网 >C语言

热点推荐