将链表头传递给函数作为C中的地址

时间:2015-08-29 06:05:09

标签: c pointers linked-list pass-by-reference

我有一个关于通过函数传递C中链表头部的问题。所以代码就像这样:

#include <stdio.h>
//Defining a structure of the node
struct node { 
    int data;
    struct node* next;
    };

void insert (struct node* rec, int x) {
    struct node* temp = (struct node*)malloc(sizeof(struct node));
    temp->data = x;
    temp->next = NULL;
    rec = temp; // head and rec is now pointing to the same node
}

void print(struct node* rec){
    printf("%d", rec->data); //error occurs here
    puts("");
}

main(){
    struct node *head = NULL; //head is currently pointing to NULL
    insert (head, 5); //Passing the head pointer and integer 5 to insert()
    print(head);
}

如您所见,当我尝试打印rec-&gt;数据时发生错误。为什么会出现错误?我以为既然指针rec和head都指向堆中的同一个节点,那应该没有任何问题?

谢谢。

3 个答案:

答案 0 :(得分:5)

您可以按照@ sje397的建议传递struct node**

但是,我会建议以下设计(在我看来也更容易推理):

/* returns the new head of the list */
struct node *insert (struct node* current_head, int x) {
    struct node* temp = (struct node*)malloc(sizeof(struct node));
    temp->data = x;
    temp->next = current_head;
    return temp;
}

并像

一样使用它
head = insert(head, 5);

在这种情况下,我还会将函数重命名为push_front

为了完整起见,我认为@ sje397意味着类似以下内容(每个C程序员一次又一次地重写典型的链表代码......):

void insert(struct node **head, int x) {
    struct node* new_head = (struct node*)malloc(sizeof(struct node));
    new_head->data = x;
    new_head->next = *head;

    *head = new_head;
}

答案 1 :(得分:1)

在C中没有通过引用传递。
你的插入函数没有在列表中插入一个节点,它只是改变了头指向的节点。由于temp->next = NULL,列表将始终包含两个节点。

另一个错误是您只是修改头节点的本地副本。 要解决此问题,您有3个选择:

- 您可以将头节点设为全局

- 您可以将指针传递给指向函数的头节点(指针指针)。

- 您可以通过该函数返回修改后的头节点。

答案 2 :(得分:-1)

insert函数重新定义为:

void insert (struct node** rec, int x) {
    struct node* temp = (struct node*)malloc(sizeof(struct node));
    temp->data = x;
    temp->next = NULL;
    *rec = temp; // head and rec is now pointing to the same node
}