我想通过将节点附加到尾部来构建列表{1,2,3,4,5}。出于客户端的目的,使用尾指针在最后一个节点之后插入所有其他节点。这个解决方案唯一的“问题”是可以优化第一个节点的编码单独特殊情况,客户端正在按我。尽管如此,这种方法在理论上对于生产代码应该是可靠的...至少我想到,当我到达尾部时它一直抛出空指针异常......我错过了什么?
struct node* BuildWithSpecialCase() {
struct node* head = NULL;
struct node* tail;
int i;
Push(&head, 1);
tail = head;
for (i=2; i<6; i++) {
Push(&(tail->next), i);
}
return(head);
}
答案 0 :(得分:2)
如果所有的访问指针都是从头到尾移动,那么向尾部添加节点会将它们暴露给&#34; new&#34;在查询&#34;时没有存在的数据。列表的开头。
与您的客户交谈,也许不只是&#34;优化&#34;危在旦夕。
---看到你的代码编辑后编辑---
如果不了解Push
正在做什么,我猜它会将链接列表顶部的节点推送到堆栈上。
Push(&head, 1);
tail = head;
到目前为止,非常好。
for (i=2; i<6; i++) {
Push(&(tail->next), i);
}
您似乎只是Push
在尾部编辑了几个节点,但我无法看到您实际更新尾部的位置以维护它对列表末尾的引用。在我的阅读中,head
仍然指向列表的头部,tail
仍然指向列表的头部(来自作业tail = head
)并且您有很多&#34 ;额外&#34;超越尾部的节点。
这是问题吗?