繁体   English   中英

C中的链表问题

[英]Problems with a Linked List in C

我正在用C创建一个(结构的)链表,但是我希望能够调用一个函数,并让它自己将4-5个结构添加到列表中。 问题是因为在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);
}

显然这是行不通的。 我该怎么做? 可能吗 谢谢

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

您必须使用malloc()分配“一个”,“两个”,“三个”,而不是在堆栈上创建它们。 处理完它们之后,您将不得不再次遍历该列表并在内存上调用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;
}

在此代码中:

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

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

我假设您要创建一个双向链接列表,所以我可以自由设置相应的左/右指针。 如果我的假设不对,请进行调整以适合您的需求。

干杯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM