c - 通过构建尾部优化链表中的一个特例

标签 c linked-list

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

最佳答案

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

与您的客户交谈,可能不仅仅是“优化”受到威胁。

--- 看到你的代码编辑后编辑---

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

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

到目前为止,还不错。

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

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

是这个问题吗?

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

相关文章:

c++ - Windows 将标准 C 文件结构注入(inject)正在运行的进程

c - 链表崩溃

c - 这种在c中使用链表代码的插入排序有什么问题?

c - 没有双向链表

比较 c 上的字符(字母)

c - 在 C 中将整数分类/映射到各种类别的优雅方法是什么?

c - C 中的多重链表

algorithm - 由于链表中没有随机访问,使用快速排序对链表进行排序真的比合并排序慢吗?

c - 如何在MPI中传递二维数组并使用C语言创建动态标签值?

c++ - 在 C++ 中计算方程解