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

请判断该C语言双向链表insert_after_node函数的实现是否正确

请判断该C语言双向链表insert_after_node函数的实现是否正确

嘿,我看你提到在YouTube上学习C语言双向链表时,碰到了一个insert_after_node函数,想判断它的实现是否正确对吧?不过你贴出来的函数代码好像没写完,只到void insert_after_node(node_t *node_to_insert_after, node_t* newn这里,没法直接分析完整实现。不过先给你理清楚上下文,再讲讲这个函数的正确实现逻辑,你可以对照手里的完整代码自行判断~

首先,你说node_t是这个结构体的typedef:

struct node {
    int value;
    struct node* next;
    struct node* prev;
};

一个正确的insert_after_node函数,必须要维护双向链表的双向链接,核心步骤不能少,我给你拆解一下:

  • 先做边界检查:如果传入的node_to_insert_after或者新节点newn是空指针,直接返回,避免空指针操作导致程序崩溃
  • 绑定新节点的前驱:把newn->prev指向node_to_insert_after(也就是要插入的位置的前一个节点)
  • 绑定新节点的后继:把newn->next指向node_to_insert_after->next(原节点的下一个节点)
  • 处理原节点的后继节点:如果node_to_insert_after->next不是空指针(说明原节点不是链表尾节点),必须把原后继节点的prev指向新节点,不然这一段的双向链接就断了
  • 最后更新原节点的后继:把node_to_insert_after->next指向新节点,完成插入

给你一个标准的正确实现参考:

void insert_after_node(node_t *node_to_insert_after, node_t* newn) {
    // 空指针边界检查
    if (node_to_insert_after == NULL || newn == NULL) {
        return;
    }

    // 建立新节点与前后节点的链接
    newn->prev = node_to_insert_after;
    newn->next = node_to_insert_after->next;

    // 若原节点不是尾节点,更新原后继节点的前驱指针
    if (node_to_insert_after->next != NULL) {
        node_to_insert_after->next->prev = newn;
    }

    // 完成原节点到新节点的链接
    node_to_insert_after->next = newn;
}

你可以对照自己手里的完整代码,检查这几点:

  • 有没有做空指针的有效性检查?
  • 新节点的prev和next是不是都正确赋值了?
  • 当原节点不是尾节点时,有没有更新原后继节点的prev指针?
  • 最后有没有把原节点的next指向新节点?

如果这些步骤都完整覆盖,那这个实现就是正确的;要是漏了某一步(比如没处理原后继节点的prev),那双向链表的结构就会出现断裂,后续的遍历、删除等操作很可能会出问题。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 12:48:11