这可能是一个非常简单的解决方案的问题,但我无法理解它...我正在尝试使用结构实现学校项目的链表,但是当我初始化它时第一个节点,malloc似乎根本没有效果
到目前为止,这是我的代码:#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef struct Node Node;
struct Node
{
int data;
Node *next;
};
void init_List(Node *head, int data)
{
head = (Node*)malloc(sizeof(Node));
if(head == NULL)
{
printf("Memory Allocation Error");
return;
}
head->data = data;
head->next = NULL;
}
int main()
{
Node *head = NULL;
int N;
printf("N: ");
scanf("%d", &N);
init_List(head, N);
printf("%d", head->data);
}
我阅读的任何数字都使我的节点的第一个数据打印为cero。不知道会发生什么。 谢谢你的帮助!
答案 0 :(得分:2)
当您将head
传递给函数init_List
时,会生成head
的本地副本,然后将内存分配给此本地指针。在main
中,head
仍然指向NULL
。
您需要在函数参数中使用指向指针的指针。
void init_List(Node **head, int data)
{
*head = malloc(sizeof(Node));
if(*head == NULL)
{
printf("Memory Allocation Error");
return;
}
(*head)->data = data;
(*head)->next = NULL;
}
你的函数调用应该是
init_List(&head, N);
另请注意,请勿转换malloc
的返回值。
答案 1 :(得分:0)
事实上,您已经在声明
中初始化了列表Node *head = NULL;
所以你需要的是一个能够在列表中推送前整数的函数。该功能可以按以下方式查看
void push_front( Node **head, int data )
{
Node *tmp = malloc( sizeof( Node ) );
if ( tmp != NULL )
{
tmp->data = data;
tmp->next = *head;
*head = tmp;
}
else
{
printf( "Memory Allocation Error" );
}
}
该功能按以下方式调用
push_front( &head, n );
考虑到用一个大写字母命名变量是个坏主意。
至于你的问题,那么函数参数就是它们的局部变量。因此,任何局部变量的更改都不会影响原始参数。函数处理其参数的副本。
所以在函数中
void init_List(Node *head, int data)
{
head = (Node*)malloc(sizeof(Node));
//...
更改了局部变量head
。虽然它与用于调用函数的参数具有相同的名称,但是局部变量的任何更改都不会影响参数。原始论点不会改变。您必须将参数声明为指针Node **head
的指针。