我遇到了创建一个插入到链接列表顶部的算法的挑战。我设置了一个指针来跟踪列表的顶部。
#include "Entry.h"
int main(void)
{
struct entry list;
struct entry *listPtr = &list;
list.value = 100;
n1.value = 200;
n2.value = 300;
n3.value = 400;
initList(&list);
struct entry insert;
insert.value = 1000;
update(&insert, &n2);
return 0;
}
练习建议我可以使用update方法在列表的前面插入一个新条目。我怎么能做到这一点?
#include <stdio.h>
#include <stdbool.h>
struct entry
{
int value;
struct entry *next;
}n1, n2, n3, end;
void initList(struct entry *list)
{
list->next = &n1;
n1.next = &n2;
n2.next = &n3;
n3.next = &end;
end.value = 0;
}
void update(struct entry *insert, struct entry *after)
{
insert->next = after->next;
after->next = insert;
}
答案 0 :(得分:1)
您可以轻松地将update
功能更改为
struct entry *update(struct entry *insert, struct entry *before, struct entry *after)
{
insert->next = after;
if (before != NULL)
{
before->next = insert;
return before;
}
return insert;
}
其中insert
是要插入的条目,before
是插入的节点之前的节点,after
是插入的节点之后的节点。如果将新条目作为第一个条目插入,则该函数返回新条目,否则返回before
。
要预先添加到列表,请使用
list_to_prepend_to = update(node_to_insert, NULL, list_to_prepend_to);
例如,在您的代码中,您可以使用
listPtr = update(&insert, NULL, &list);
while (listPtr)
{
printf("%d\n", listPtr->value);
listPtr = listPtr->next;
}
将一个条目添加到列表中并打印出列表。要插入列表中间,您不需要返回值:
update(&insert, &list, &n1);
这将使insert
成为列表中的第二个条目。
答案 1 :(得分:0)
您正在将n2的地址传递给更新功能。 n2不是列表元素的顶部。这将插入一个元素b / w n2并结束。 在第一个元素之后插入元素顶部调用 -
更新(&amp; insert,&amp; list);
将新元素添加到列表中 -
struct entry new_element;
new_element.next =&amp; list;
new_element.value = some_value;