通过函数传递链表头作为C中的地址
Passing a linked list head through a function as address in C
我有一个关于在 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->data 时出现错误。为什么会发生错误?我想既然指针rec和head都指向堆中的同一个节点,应该不会有什么问题吧?
谢谢。
将 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
}
您可以按照@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;
}
在 C 中没有引用传递。
您的插入函数不会在列表中插入节点,它只是更改头部指向的节点。由于 temp->next = NULL
列表将始终包含两个节点。
另一个错误是您只是在修改头节点的本地副本。
要解决此问题,您有 3 个选择:
-您可以将头节点设为全局
-您可以将指向头节点的指针(指向指针的指针)传递给函数。
-可以return函数修改的头节点
我有一个关于在 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->data 时出现错误。为什么会发生错误?我想既然指针rec和head都指向堆中的同一个节点,应该不会有什么问题吧?
谢谢。
将 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
}
您可以按照@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;
}
在 C 中没有引用传递。
您的插入函数不会在列表中插入节点,它只是更改头部指向的节点。由于 temp->next = NULL
列表将始终包含两个节点。
另一个错误是您只是在修改头节点的本地副本。 要解决此问题,您有 3 个选择:
-您可以将头节点设为全局
-您可以将指向头节点的指针(指向指针的指针)传递给函数。
-可以return函数修改的头节点