C中链接列表的问题

时间:2009-06-15 20:48:23

标签: c linked-list

我在C中创建了一个链接列表(结构),但我希望能够调用一个函数并让它自己添加4-5个stuct到列表中。问题是因为在C中,所有在函数中创建的变量都留在了堆栈/堆上,我不知道我应该如何实现这一点。

这是一个代码示例:

struct listItem
{
   int value;
   listItem *left;
   listItem *right;
}

void addItems(listItem *l)
{
   listItem one, two, three;
   l->left = &one;
   one.left = &two;
   two.left = &three;
}

int main (char *a [])
{
   listItem l;
   addItems(l);
}

显然这不起作用。我怎么能做到这一点?它甚至可能吗? 感谢

编辑:哇谢谢大家的帮助。这比我想象的更快,更有帮助!

3 个答案:

答案 0 :(得分:5)

您必须使用malloc()分配“one”,“two”,“three”,而不是在堆栈上创建它们。在完成它们之后,你将不得不再次浏览列表并在内存上调用free(),这样你的程序就不会泄漏。

试试这个addItem而不是......

void addItem(listItem *l, int value)
{
   listItem* item = malloc (sizeof (listItem));
   item->value = value;
   item->next = 0;
   item->prev = l; // Probably not what you want, but you were only singly linking in the example

   l->next = item;
}

答案 1 :(得分:3)

在此代码中:

void addItems(listItem *l)
{
   listItem one, two, three;
   l->left = &one;
   one.left = &two;
   two.left = &three;
}

所有变量都留在堆栈上,而不是堆。可能你想在堆上分配它们,这样你就可以引用一个指向它们的指针,一旦剩下堆栈帧就不会无效:

void addItems(listItem *l)
{
   listItem *one=calloc(1, sizeof(*one)), 
     two=calloc(1, sizeof(*two)),
     three=calloc(1, sizeof(*three));
   l->left = one;
   one.left = two;
   two.left = three;
}

答案 2 :(得分:2)

addItems()必须分配内存:

void addItems(listItem *l)
{
   listItem* one = (listItem*)malloc(sizeof(listItem));
   listItem* two = (listItem*)malloc(sizeof(listItem));
   listItem* three = (listItem*)malloc(sizeof(listItem));
   l->left = 0;
   l->right = one;
   one->left = l;
   one->right = two;
   two->left = one;
   two->right = three;
   three->left = two;
   three->right = 0;
}

int main ()
{
   listItem l;
   addItems(&l);
}

我假设你要创建一个双链表,所以我可以相应地设置左/右指针。如果我的假设错了,请调整以适合您的需要。

干杯