我的C程序功能有问题。功能的想法是将一个项目(newval)添加到链接列表的末尾。这是我的代码(也可以用它找到评论):
#include <stdlib.h>
struct list
{
int val;
struct list *next;
};
void add_to_list(struct list *l, int newval)
{
if (!l) return; //my fried said that I should add this, but I dont really understand why.
//and should it be if(l == NULL) rather than if(!l)?
while(l->next !=NULL) // I am pretty sure that this while loop is correct
l=l->next;
l->next = malloc(sizeof(int)) //hmm... is this correct way to allocate memory
l->next->val = newval; //not sure about this
l->next->next = NULL; //This should be fine
}
答案 0 :(得分:2)
l->next = malloc(sizeof(int));
您需要为结构分配内存而不是int
l->next = malloc(sizeof(struct list));
if(!l)
与if(l == NULL)
答案 1 :(得分:0)
你应该分配
l->next = malloc(sizeof(struct list));
而不是
l->next = malloc(sizeof(int));
并用零初始化分配的内存:
memset(l->next, 0, sizeof(struct list));
答案 2 :(得分:0)
void add_to_list(struct list *l, int newval)
您的函数声明为void
。这意味着没有办法
你发出错误信号的功能。样本代码不是问题,
但绝对是你应该至少知道的事情。
if (!l) return; //my fried said that I should add this,
//and should it be if(l == NULL) rather than if(!l)?
构造(!l)
完全等同于(l != NULL)
。这个
是因为NULL
被定义为“空指针常量”,并且
“空指针常量”是“带有的整数常量表达式
值0,或类似表达式转换为void *
“。在其他情况下
单词,NULL
评估为零。
while(l->next !=NULL) // I am pretty sure that this while loop is correct
l=l->next;
是的,这个while
循环是正确的。循环完成后,l
将会
指向列表中的最后一个元素。
l->next = malloc(sizeof(int)) //hmm... is this correct way to allocate memory
您的分配几乎是正确的。你正在分配足够的存储空间
保持一个int
,但你真的需要足够的存储来容纳一个
struct list
。请改用l->next = malloc(sizeof(struct list));
。
l->next->val = newval; //not sure about this
这里没有错误。这与下一行完全一样正确。
l->next->next = NULL; //This should be fine
是的,这很好..
但是,虽然此部分代码大部分都是正确的,但除非已涵盖malloc()
,否则
l->next = malloc(sizeof(int)) //hmm... is this correct way to allocate memory
l->next->val = newval; //not sure about this
l->next->next = NULL; //This should be fine
这里使用的方法有点不寻常。这是因为
分配新内存时,您将分配指针
直接到l->next
然后初始化它。
更常见的做法是声明一个指针,如
struct list *tmp = NULL
在函数的开头,
分配时,将新内存分配给tmp
。然后,
初始化tmp
指向的新列表元素,和
然后才将现在初始化的新列表元素添加到
列表的末尾。虽然这涉及更多的代码,
它分离了创建新列表元素的两个步骤
并将该元素添加到列表的末尾。
void add_to_list(struct list *l, int newval)
{
struct list *tmp = NULL;
if (!l) return; // If no valid list, return.
tmp = malloc(sizeof(struct list)); // Allocate new list element
tmp->val = newval; // and fill it up.
tmp->next = NULL; // End of the list always points nowhere.
while(l->next !=NULL) // find end of list.
l=l->next;
l->next = tmp; // Attach new list element to end.
return;
}
此外,这样做可以避免可能出现的混乱
通过l->next
指针分配值。