C语言中的链表问题
我正在用C制作一个链表(结构),但我希望能够调用一个函数,并让它自己向链表中添加4-5个结构。问题是因为在C语言中,函数中创建的所有变量都留在堆栈/堆上,所以我不知道应该如何实现这一点 下面是一个代码示例:C语言中的链表问题,c,linked-list,C,Linked List,我正在用C制作一个链表(结构),但我希望能够调用一个函数,并让它自己向链表中添加4-5个结构。问题是因为在C语言中,函数中创建的所有变量都留在堆栈/堆上,所以我不知道应该如何实现这一点 下面是一个代码示例: struct listItem { int value; listItem *left; listItem *right; } void addItems(listItem *l) { listItem one, two, three; l->left
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(),这样您的程序就不会泄漏
请尝试此附加项
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;
}
您必须使用malloc()分配“一”、“二”、“三”,而不是在堆栈上创建它们。在处理完它们之后,您必须再次遍历列表并调用内存中的free(),这样您的程序就不会泄漏
请尝试此附加项
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;
}
在此代码中:
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);
}
我假设您要创建一个双链接列表,因此我可以相应地设置左/右指针。如果我的假设是错误的,请调整以适合您的需要
CheersaddItems()必须分配内存:
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);
}
我假设您要创建一个双链接列表,因此我可以相应地设置左/右指针。如果我的假设是错误的,请调整以适合您的需要
干杯