请判断该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
相关产品推荐
相关产品推荐

