我有一个双向链表,假设它是这样的:
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/