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

时间:2017-03-25 20:29:15

标签: c list pointers global

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

我要做的是创建一个linked list,其中包含节点(struct包含一些信息),并且在每insert()之后,列表会动态扩展一个node 1}}(除非有问题的元素已经存在,在这种情况下会覆盖成员name)。
指针next指向list中的下一个元素(我从malloc()分配新节点的位置。

程序正确编译并使用以下输出执行:
 每{{}}}次电话retrieve returned: (NULL)
这就是为什么我认为全局指针(列表的头部)没有正确更新

我很抱歉这个天真的问题,但我似乎无法找到作业/分配出错的地方,
无论如何,请事先感谢您的协助。

printf()

2 个答案:

答案 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