在我问这个问题之前,我已经搜索了很多,但是我无法让这一小段代码工作。
我知道使用global pointer
(或变量)被认为是不良做法(而不是通过引用传递)但我不得不遗憾地使用这种做法。
我要做的是创建一个linked list
,其中包含节点(struct
包含一些信息),并且在每insert()
之后,列表会动态扩展一个node
1}}(除非有问题的元素已经存在,在这种情况下会覆盖成员name
)。
指针next
指向list
中的下一个元素(我从malloc()
分配新节点的位置。
程序正确编译并使用以下输出执行:
每{{}}}次电话retrieve returned: (NULL)
这就是为什么我认为全局指针(列表的头部)没有正确更新
我很抱歉这个天真的问题,但我似乎无法找到作业/分配出错的地方,
无论如何,请事先感谢您的协助。
printf()
答案 0 :(得分:1)
void insert(char *id, char *name)
{
struct node *temp = NULL, **pp;
/* Pointer to pointer points to the global */
for(pp = &list; *pp ; pp = &(*pp)->next){
if(strcmp(id, (*pp)->id) ) continue;
free((*pp)->name);
(*pp)->name = strdup(name);
return;
}
//insert at the end of the list
temp = malloc(sizeof *temp);
if(!temp ){
printf("memory allocation failed\n");
return;
}
temp->id = strdup(id);
temp->name = strdup(name);
temp->next = NULL;
*pp = temp;
return;
}
你甚至可以不使用* temp指针:
void insert(char *id, char *name)
{
struct node **pp;
for(pp = &list; *pp ; pp = &(*pp)->next){
if(strcmp(id, (*pp)->id) ) continue;
free(p->name);
p->name = strdup(name);
return;
}
// pp now points to the terminal NULL pointer
*pp = malloc(sizeof **pp);
if(!*pp ){
printf("memory allocation failed\n");
return;
}
(*pp)->id = strdup(id);
(*pp)->name = strdup(name);
(*pp)->next = NULL;
return;
}
答案 1 :(得分:0)
除了使用list
之外,您永远不会初始化NULL
。因此,
char *retrieve(char *id){
if(list == NULL)
return NULL;
始终返回NULL
。