我是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
}
答案 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;
}