1

我想通过将节点附加到尾部来构建一个列表 {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); 
}
4

1 回答 1

2

如果您的所有访问指针都从头到尾移动,那么将节点添加到尾部会将它们暴露给在列表的“查询”开始时不存在的“新”数据。

与您的客户交谈,也许不仅仅是“优化”。

---在看到您的代码编辑后进行编辑---

如果不了解Push正在做什么,我猜它会将一个节点推到链表的顶部,就好像它是一个堆栈一样。

Push(&head, 1);
tail = head;

到目前为止,一切都很好。

for (i=2; i<6; i++) {
    Push(&(tail->next), i); 
}

看来您只是Push在尾部编辑了几个节点,但我看不到您实际更新尾部的位置以保持它对列表末尾的引用。在我的阅读中,head仍然指向列表的头部,tail仍然指向列表的头部(来自 assignment tail = head),并且除了尾部之外还有很多“额外”节点。

那是问题吗?

于 2012-09-06T14:42:41.617 回答