gpt4 book ai didi

c - 全局指针(链表头)未正确更新

转载 作者:行者123 更新时间:2023-11-30 14:59:04 24 4
gpt4 key购买 nike

在我问这个问题之前,我已经搜索了很多,但我无法让这一小段代码工作。
我知道使用全局指针(或变量)被认为是一种不好的做法(而不是通过引用传递),但我不得不遗憾地使用这种做法。

我想做的是创建一个由节点(带有一些信息的struct)组成的链表,并在每个insert()<之后 该列表动态扩展一个节点(除非相关元素已存在,在这种情况下,成员name 将被覆盖)。
指针 next 指向 list 中的下一个元素(这是我从 malloc() 分配新节点的位置。

程序正确编译并执行,输出如下:
每次 printf() 调用时检索返回:(NULL)
这就是为什么我认为全局指针(列表的头部)没有正确更新

我对这个天真的问题感到抱歉,但我似乎找不到分配/分配出错的地方,
无论如何,提前感谢您的帮助。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct node{
char *id;
char *name;
struct node *next;
};
struct node* list; //list head
struct node* p; //pointer to list head

char *retrieve(char *id){
if(list == NULL)
return NULL; //list is empty, no element to return.
for(p = list; p != NULL; p = p->next)
if(strcmp(id, p->id) == 0)
return p->name;
return NULL;
}

void insert(char *id, char *name){
int exists = 0;
struct node* temp = NULL;
for(p = list; p != NULL; p = p->next){
if(strcmp(id, p->id) == 0){ //id already exists, overwrite with the new name.
free(p->name);
p->name = strdup(name);
exists = 1;
break;
}
}
if(exists) return;
//insert at the end of the list
temp = malloc(1 * sizeof(struct node));
if(temp == NULL){
printf("memory allocation failed\n");
return;
}
temp->id = strdup(id);
temp->name = strdup(name);
temp->next = NULL;
p = temp;
return;
}

int main(){
struct node* temp = NULL;
p = NULL;
list = NULL;
insert("145a","Jim");
insert("246b","Alice");
insert("322c","Mike");
printf("retrieve returned: %s\n\n", retrieve("145a"));
printf("retrieve returned: %s\n\n", retrieve("246b"));
printf("retrieve returned: %s\n\n", retrieve("322c"));
p = list;
while(p != NULL){ // node deletion starting from first to last element.
free(p->id);
free(p->name);
temp = p;
p = p->next;
free(temp);
}
return 0;
}

最佳答案

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

关于c - 全局指针(链表头)未正确更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43021617/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com