2016-12-26 119 views
-1

我想建立一个链表,但由于某种原因我的头没有正确更新。下面是我的代码,我打算不能工作的片段:设置指向结构的指针等于指向函数返回的结构的另一个指针?

typedef struct node { 
    int data; 
    struct node *next; 
} * node; 

node create_node(int data) { 
    node to_return = calloc(1, sizeof(struct node)); 
    to_return->data = data; 
    to_return->next = NULL; 
    return to_return; 
} 

int insert(int data, node head) { 
    if (head == NULL) { 
    head = create_node(data); 
    } 
    . 
    . 
    . 
    } 
    return 1; 
} 

int main(int argc, char **argv) { 

    node head = NULL; 
    insert(1, head); 

    printf("head->data: %d", head->data); 
} 

在这个例子中,我试图创建链接列表的使用insert()的第一个节点。但是,我收到SEG错误,这意味着create_node()返回的to_return节点指针没有正确设置到insert()中的节点头部。我在这里错过了什么?

编辑:我重复检查和头正在插入()正确设置。由于某些原因,更改不会持续

+0

我很抱歉,但我仍然困惑。我试图在insert()中打印head-> data,并且我得到正确的值,但是由于某些原因,当程序退出函数insert() – YSA

+0

时,更改不会持久。还忘记提及该节点是指向一个结构。 – YSA

+1

**从来没有**''typedef'指针! – Olaf

回答

3

一个指针传递给该节点:

int insert(int data, node* head) { 
    if (*head == NULL) { 
    *head = create_node(data); 
    } 
    . 
    . 
    . 
    } 
    return 1; 
} 

int main(int argc, char **argv) { 

    node head = NULL; 
    insert(1, &head); 

    printf("head->data: %d", head->data); 
} 

(和BTW说typedef会是让人有些困惑,因为插入函数的第二个参数实际上是struct node **型)

2

在C和C++中,除非明确标记为引用,否则所有函数参数均按值传递。这包括指针参数。

您的insert函数试图更改第一个参数,如果它是空指针的情况。这将不起作用,因为对指针所做的任何更改都不会从该函数传递。如果您想要更改head,则需要将node *headnode& head(使用C++)传递给您的insert函数。