首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

删除链表头结点的困惑

2012-03-30 
求助:删除链表头结点的困惑给出n,删除链表中数据项为n的结点第一个代码如果头结点数据项为n则会出现错误,

求助:删除链表头结点的困惑
给出n,删除链表中数据项为n的结点

第一个代码如果头结点数据项为n则会出现错误,其他结点删除正常。
第二个代码运行正常,只是修改了第一个代码增加了一个返回值

对于指针理解不清楚
我对指针的理解是:指针就是地址。
那么同样的代码对指针进行操作,为什么有返回值和没有返回值的结果不同?


C/C++ code
void ListDelete(Linklist *l, int n){    if(l == NULL)        return ;    Linklist *p,*q;    p = l->next;    q = l;    while(p)                   //从第二个结点开始寻找数据项为n的结点    {        if(p->data == n)        {             q->next = p->next;             free(p);             p = q->next;        }        else        {            q = p;            p = p->next;        }    }    if(l->data == n)            //删除头结点    {        q = l->next;        free(l);        l = q;    }}




C/C++ code
Linklist* ListDelete(Linklist *l, int n){    if(l == NULL)        return ERROR;    Linklist *p,*q;    p = l->next;    q = l;    while(p)    {        if(p->data == n)        {             q->next = p->next;             free(p);             p = q->next;        }        else        {            q = p;            p = p->next;        }    }    if(l->data == n)    {        q = l->next;        free(l);        l = q;    }    return l;}


[解决办法]
探讨
给出n,删除链表中数据项为n的结点

第一个代码如果头结点数据项为n则会出现错误,其他结点删除正常。
第二个代码运行正常,只是修改了第一个代码增加了一个返回值

对于指针理解不清楚
我对指针的理解是:指针就是地址。
那么同样的代码对指针进行操作,为什么有返回值和没有返回值的结果不同?


C/C++ code

void ListDelete(Linklist *l, int……

[解决办法]
第一个没有返回值的,最后那段代码块中把q赋值给l,l最终的值作用域仅在代码块中,此函数被调用后并没有改变头指针的指向。而此函数已经删除了头指针存储的空间。下次使用则会出现问题。
第二个返回了头指针的,将修改后的头指针的拷贝赋值给了新的头指针。所以下次使用不会出现问题。
如果只2个函数一次的话,仅是返回类型有区别。
[解决办法]
探讨
第一个没有返回值的,最后那段代码块中把q赋值给l,l最终的值作用域仅在代码块中,此函数被调用后并没有改变头指针的指向。而此函数已经删除了头指针存储的空间。下次使用则会出现问题。
第二个返回了头指针的,将修改后的头指针的拷贝赋值给了新的头指针。所以下次使用不会出现问题。
如果只2个函数一次的话,仅是返回类型有区别。

[解决办法]
哦,上面理解错误,其实不是l的作用域有错,而是p为局部变量,在函数结束之后栈内容被销毁,把p的值赋给l,在函数结束之后没有内容,所以l的值改变错误
[解决办法]
要改变指针的指向,必须要用到双指针,即传进去的时候用Linklist **l,也就是为什么你要删除首节点的时候会出错。

热点排行