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 调试器查看),但是当我退出函数时,我的列表保持不变。

我知道这可以通过让我的方法返回 astruct list_t*而不是来完成void,也可以通过将指向 head 指针的指针作为参数 ( struct list_t** PtoHead) 传递,但我的问题是是否可以使用我的方法执行此操作(即返回void并有一个指向head作为参数的指针)。

4

1 回答 1

1

你可以做到,但它会很丑。

如果将新元素链接为元素编号 2,并相应地移动数据,则可以用新元素替换旧元素,同时在其后添加新元素:

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,对于那种情况,我认为使用这个原型是不可能解决的。

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

于 2012-09-28T14:13:02.323 回答