c - 在双向链表当前位置插入节点

标签 c linked-list nodes

我有一个双向链表,假设它是这样的:

typedef struct node {
  int data;
  node_t *prev, *next;
} node_t;

它已被设置、推送等。假设它包含 20 个值。

node_t *foo = malloc(sizeof(node_t));   // the actual list
for (int i = 0; i < 20; i++)
    push(&foo, i+1);

我还有一些代码可以让我的列表到达某个点。假设它到达索引 12:

for (int i = 0; i < 12; i++)
    foo = foo->next;

现在我想在列表中的当前位置插入一个节点。所以目前我的列表是这样的:

index: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,  10, 11, 12, 13, 14, 15, 16, 17, 18, 19
value: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
                                              ^ current position

在这里插入一个值为 8 的节点应该将其变成这样:

index: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,  10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
value: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 8,  13, 14, 15, 16, 17, 18, 19, 20
                                              ^ current position

我使用它来插入节点(排除错误检查):

void insert_at_start(node_t **head, int val)
{
    node_t *newnode = malloc(sizeof(node_t));

    newnode->data = val;
    newnode->next = (*head);
    (*head) = newnode;
}

但是,这不会保留当前位置左侧的任何数据;只能向右。它将列表变成这样:

index: 0, 1,  2,  3,  4,  5,  6,  7,  8
value: 8, 13, 14, 15, 16, 17, 18, 19, 20
       ^ current position

如何修改 insert_at_start(将其更改为 insert_at_current),以便保留列表的左侧,而不假设我知道列表所在的索引?

最佳答案

假设您当前的位置是索引 11 处的节点。

您希望在索引 11 和索引 12 之间插入。 假设 head 指向索引 11 处的节点。

  void insert_at_start(node_t **head, int val)
    {
        node_t *newnode = malloc(sizeof(node_t));

        newnode->data = val;

        //insert between two node eg. node 11 and 12
        node_t *n_11 = *head;        // node 11
        node_t *n_12 = (*head)->next; // node 12

        n_11->next = newnode;
        n_12->prev = newnode;

        newnode->next = n_12;
        newnode->prev = n_11;

        (*head) = newnode;
    }

关于c - 在双向链表当前位置插入节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46867795/

相关文章:

javascript - Jstree - 如果在 Jstree 中检查了父节点,如何检查子节点?

c - 使用 PIC32 的定时器 2 设置延迟

c - 使用 kill 向父进程发送信号让我退出

java - 如何将整数数组转换为数组列表和链表?

java - LinkedList getFirstElement 和 getLastElement 方法

java - 在 Java 的双向链表中将对象添加到另一个对象之前

c++ - Visual C++ 错误 LNK2019

c - elf .rel.text 部分 R_386_32/R_386_PC32 的含义

c - 通过引用更新数组的地址

nodes - Gephi未在图形上显示“节点和边”