在给定节点之后将新节点插入到双向链表中

Posted

技术标签:

【中文标题】在给定节点之后将新节点插入到双向链表中【英文标题】:Inserting a new node into a doubly linked list after a given node 【发布时间】:2018-08-21 23:15:51 【问题描述】:

此函数在双向链表中的给定节点之后插入一个新节点。

除非列表为空或给定节点为 NULL,否则它运行良好。

我尝试通过插入新节点作为头来解决这个问题,但它没有添加新节点或添加第二个节点时出现问题。

void insert(Polynomial** node, int new_data, int pow) 
Polynomial* new_node = ( Polynomial*)malloc(sizeof( Polynomial));
new_node->num = new_data;
new_node->pow = pow;

if ((*node) == NULL) 
    new_node->prev = NULL;
    (*node) = new_node;
    return;


new_node->next = (*node)->next;
(*node)->next = new_node;
new_node->prev = (*node);

if (new_node->next != NULL)
    new_node->next->prev = new_node; 

结构:

typedef struct Polynomial 
int num;
int pow;
struct Polynomial* next;
struct Polynomial* prev;
Polynomial;

【问题讨论】:

node = new_node 仅更改 local 变量 node,因此您的函数不会修改传递给它的节点指针的值。 现在尝试使用指向指针的指针,头节点可以工作,但是在将第二个节点添加到列表中时它不起作用。 显示新代码。 “它不起作用”不是有效的问题描述。 用新代码编辑了问题 我不断收到 new_node->下一个是 0xCDCDCDCD。 【参考方案1】:

当您创建一个新列表时,第一个节点的next 指针未指定。这可能会在插入第二个节点时导致未定义的行为,例如您看到的 0xcdcdcdcd 值。返回前设置为null:

if ((*node) == NULL) 
    new_node->prev = new_node->next = NULL;
    (*node) = new_node;
    return;

【讨论】:

哦,谢谢。它运作良好,我现在明白我的错误了。 :) 在声明时初始化所有变量以防止此类意外:)

以上是关于在给定节点之后将新节点插入到双向链表中的主要内容,如果未能解决你的问题,请参考以下文章

js实现双向链表

javascript中的链表结构—双向链表

双向链表插入节点

数据结构C语言版 —— 链表增删改查实现(单链表+循环双向链表)

如何从c中的双向链表中删除节点

双向链表(c++实现)