在C语言的链表中,“addFirst”方法是什么?

3

我有一个创建的列表:

struct list_t {
   int value;
   struct list_t* next;
};

我的“addFirst”:

void addFirst(struct list_t* head,int value) {

    struct list_t* toAdd = (struct list_t*) malloc (sizeof (struct list_t));
    toAdd->value = value;

    toAdd->next = head;
    head = toAdd;
}

问题是,当我向列表中添加新的“节点”时,在函数中它能够正常工作(使用DDD调试器进行查看),但当我退出函数后,我的列表仍然保持不变。
我知道可以通过使我的方法返回一个struct list_t*而不是void来完成此操作,并且也可以通过将指向头部指针的指针(struct list_t** PtoHead)作为参数传递来完成此操作,但我的问题是是否可能使用我的方法来实现这一点(即返回void并具有指向head的指针作为参数)。
1个回答

1

你可以这样做,但会很丑陋。

如果你将新元素作为第二个元素链接,并相应地移动数据,你可以用新元素替换旧头部并在其后添加一个新元素:

void addFirst(struct list_t* head, int value)
{
    struct list_t* toAdd = malloc(sizeof *toAdd);

    toAdd->value = head->value;
    head->value = value;
    toAdd->next = head->next;
    head->next = toAdd;
}

这假设 head 不是 NULL,对于这种情况,我认为使用这个原型是不可能解决的。

我强烈建议不要这样做,这非常不直观。


哇,那真是太糟糕了,但我想我还是得做,因为我无法改变这个方法。非常感谢! - Onica Radu
不过,这是一个很棒的技巧。+1。 - ArjunShankar
@OnicaRadu 嗯,这很糟糕,因为如果您在其他地方保存了指向某些结构的指针,则此后它们将不再指向正确的值。您应该使用 struct list_t **head 方法 :) PS:当命名您的结构时要小心,list_t 更像是 typedef 名称而不是结构名称... - Julien Fouilhé

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接