更新链接列表顶部条目

时间:2015-11-08 03:47:11

标签: c

我遇到了创建一个插入到链接列表顶部的算法的挑战。我设置了一个指针来跟踪列表的顶部。

#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;
}

2 个答案:

答案 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;