在双向链表中的给定节点之前插入节点

时间:2016-08-01 19:33:44

标签: c linked-list

我正在尝试在给定节点之前插入节点。但我无法获得所需的输出。

UNION

这里我试图在20之前插入一个节点(数据= 70)。

  

产出:30,20,10

     

预期产出:30,70,20,10

2 个答案:

答案 0 :(得分:2)

你正在做的一切正确。但是如果传递的参数insert_before是头,你在next_node中遗漏了一件事,那么你将在头部之前插入一个节点。因此,您必须将此新添加的节点设为head

答案 1 :(得分:1)

当您致电insert_before时,如果给定节点是头部,则新节点将成为新头部。因此,您需要传递head的地址才能对其进行修改。

你现在拥有的是这样的:

head
  |
  v
------          ------          ------
- 30 -   --->   - 20 -   --->   - 10 - 
------   <---   ------   <---   ------
                  ^
------            |
- 70 -   ---------|
------

要解决此问题,请在head的参数中包含insert_before的地址。

void insert_before(struct node **head, struct node *next_node, int new_data){
    struct node* temp = malloc(sizeof(struct node));   // don't cast the return value of malloc
    temp->data = new_data;

    if(next_node == NULL)
        printf("Invalid!!!!");


    temp->prev = next_node->prev;
    temp->next = next_node;
    next_node->prev = temp;

    if(temp->prev!=NULL) {
        temp->prev->next = temp;
    } else {
        *head = temp;
    }
}

然后这样称呼:

insert_before(&head,head,70);