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

最佳答案

如果所有的访问指针都是从头部到尾部的,那么向尾部添加节点会使它们暴露在“查询”列表开始时不存在的“新”数据。
与你的客户交谈,也许不仅仅是“优化”的问题。
---在看到代码编辑后编辑---
如果不知道Push在做什么,我猜它会把一个节点推到链表的顶部,就像它是一个堆栈一样。

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

到目前为止,还不错。
for (i=2; i<6; i++) {
    Push(&(tail->next), i);
}

看起来您只是在尾部编辑了几个节点,但我看不到您实际上在哪里更新了尾部以保持它对列表末尾的引用。在我的阅读中,Push仍然指向列表的头部,head仍然指向列表的头部(来自赋值tail),并且除了tail之外还有很多“额外”节点。
这就是问题所在吗?

关于c - 通过尾部构建优化链表中的特殊情况,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12301315/

10-12 21:51