如何将(结构返回类型的)空指针更改为已声明的结构?

时间:2019-08-06 16:02:39

标签: c pointers struct

我是C编程新手。我正在尝试自己实现链接列表。我遇到指针问题

我有功能

void Insert(Node* head, int x)

将节点插入“链表”的开头。问题是,当我插入第一个节点并且Node * head为NULL时,Insert函数无法将空指针的指针地址更改为新创建的节点。似乎Node * head是通过值而不是通过引用传递的。   下面提供了代码。为了调试在整个执行过程中如何更改地址,我使用了printf函数。

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

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

int main() {
    Node *head = (Node*) malloc(sizeof(Node));
    head = NULL;

    printf("head in main(): %d\n", head); // For example: 100

    Insert(head, 25);
    return 0;
}

void Insert(Node *head, int x) {
    Node *temp = (Node*) malloc(sizeof(Node));
    temp->data = x;
    temp->next = head;

    printf("temp->next address: %d\n", temp->next); // also 100

    head = temp;

    printf("%d\n", head); // not 100, something else i.e  200
}

4 个答案:

答案 0 :(得分:4)

  

似乎Node * head是通过值而不是通过引用传递的。

那是完全正确的-在C语言中,每个参数始终按值传递。 pointer 是一个值,该值通过值传递,并且调用

Insert(head, 25);

永远无法更改名为head的变量的 value 。它读取变量的值(此值是一个空指针),将该值提供给函数,并且无论如何都不会再次触摸变量 head该功能可以。

(请注意,在您的程序中,有两个变量都名为head-一个在main()中,另一个在Insert()中。Insert()中的变量是无声的函数返回时消失;没有任何东西会自动尝试将其值复制到main()中名称相似的变量中。

如果要(从概念上)通过引用传递head ,则实际上需要传递一个指向它的指针-在这种情况下,就是指向该指针的指针!您需要将函数声明为

void Insert(Node **head, int x) { ... }

并命名为

Insert(&head, 25);

然后,实际参数是指向变量head的指针,如果在适当的地方使用了参数,则该函数有机会更新该变量:

// ...
temp->next = *head;
// ...
*head = temp;
// ...

答案 1 :(得分:3)

将指针传递到指向head的指针。这样,您可以将head设置为null。

void Insert(Node **head, int x) {

    ...

    if (*head == NULL) {
        *head = temp;
    }

    else {
        ...
        *head->next = temp;
    }
}

用法:

Node *head = NULL;
Insert(&head, 10);

答案 2 :(得分:2)

有三个答案表明相同,我想提供一个替代方法: 与其将Node **传递给Insert(),不如让它返回新的head,因此:

Node *Insert( Node *head, int x )
{
     ... your code ...
     return head;
}

,如果您致电给

head = Insert( head, 24 );

与其他解决方案相比,这既没有更好也没有更坏,所以您可以根据自己的喜好进行操作

答案 3 :(得分:1)

这里有很多问题。
1.您的printf语句需要更正。
2.要插入函数,可以传递双指针。
3.在主要功能内,您无需执行Node *head = (Node*) malloc(sizeof(Node));

我已修改您的代码,如下所示。您可以尝试运行它并关联以上几点。

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

void Insert(Node **head, int x);

void Insert(Node **head, int x) {
    Node *temp = (Node*) malloc(sizeof(Node));
    temp->data = x;
    temp->next = *head;

    printf("temp->next address: %d\n", temp->data); // also 100

    *head = temp;

    printf("%d\n", (*head)->data); // not 100, something else i.e  200
}

int main() {
    Node *head = NULL;
    head = NULL;

    Insert(&head, 25);
    printf("head in main(): %d\n", head->data); // For example: 100
    return 0;
}