求助:删除链表头结点的困惑
给出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;}[解决办法]
[解决办法]
第一个没有返回值的,最后那段代码块中把q赋值给l,l最终的值作用域仅在代码块中,此函数被调用后并没有改变头指针的指向。而此函数已经删除了头指针存储的空间。下次使用则会出现问题。
第二个返回了头指针的,将修改后的头指针的拷贝赋值给了新的头指针。所以下次使用不会出现问题。
如果只2个函数一次的话,仅是返回类型有区别。
[解决办法]
[解决办法]
哦,上面理解错误,其实不是l的作用域有错,而是p为局部变量,在函数结束之后栈内容被销毁,把p的值赋给l,在函数结束之后没有内容,所以l的值改变错误
[解决办法]
要改变指针的指向,必须要用到双指针,即传进去的时候用Linklist **l,也就是为什么你要删除首节点的时候会出错。