You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的链表在头部添加节点?如何修改为尾部添加?

链表Push函数问题解答

一、当前Push函数添加到头部的原因

看代码最后两行核心逻辑:

newNode->next = (*head);
(*head) = newNode;
  • 第一行让新节点的next指向当前链表的头节点(原链表的第一个节点)
  • 第二行直接将链表的头指针*head更新为新节点
    这两步操作直接把新节点放到了链表的最前端,所以是添加到头部。

二、修改为尾部添加的实现

要将节点添加到尾部,需要找到链表的最后一个节点(即next为NULL的节点),再将其next指向新节点,同时要处理链表为空的特殊情况:

void push(struct Node** head, void *function, void *caller, void *framePointer, void *stackBegin, void *stackEnd, long start)
{
    // 分配内存并检查是否成功
    struct Node* newNode = (struct Node*) malloc(sizeof(struct Node));
    if (newNode == NULL) {
        // 内存分配失败,可根据需求添加报错或返回逻辑
        return;
    }

    // 初始化新节点数据
    newNode->function = function;
    newNode->caller = caller;
    newNode->framePointer = framePointer;
    newNode->stackFrameBeginningAddress = stackBegin;
    newNode->stackFrameEndingAddress = stackEnd;
    newNode->startTime = start;
    newNode->next = NULL; // 尾部节点的next必须置空

    // 情况1:链表为空,直接将新节点设为头节点
    if (*head == NULL) {
        *head = newNode;
        return;
    }

    // 情况2:链表不为空,遍历到最后一个节点
    struct Node* current = *head;
    while (current->next != NULL) {
        current = current->next;
    }
    // 将最后一个节点的next指向新节点
    current->next = newNode;
}

三、你遇到段错误的常见原因

用while循环实现时出现段错误,大概率是以下问题:

  • 未处理空链表:当*head为NULL时,直接访问current->next会触发空指针引用
  • 未检查malloc结果:如果内存分配失败,newNode为NULL,后续访问其成员会触发段错误
  • 遍历逻辑错误:比如循环条件写成current != NULL,最终current变为NULL后再访问current->next,同样会触发空指针错误

内容的提问来源于stack exchange,提问作者bscottunit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:25:19