C 为什么这个链表代码总是导致head为null?
我已经实现了一个简短的链表代码来添加到列表的开头 但是,头部始终包含C 为什么这个链表代码总是导致head为null?,c,linked-list,C,Linked List,我已经实现了一个简短的链表代码来添加到列表的开头 但是,头部始终包含NULL。我真的不明白它为什么会这样。感谢您的帮助!代码如下: #include<stdio.h> #include<stdlib.h> typedef struct node { int iData; struct node *next; } Node; void add2Beg(Node* head, int num); int main(int argc, char cons
NULL
。我真的不明白它为什么会这样。感谢您的帮助!代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int iData;
struct node *next;
} Node;
void add2Beg(Node* head, int num);
int main(int argc, char const *argv[])
{
Node *head = NULL;
add2Beg(head, 5);
if (head == NULL)
printf("nothing in head !!!\n");
else{
printf("not null\n");
}
add2Beg(head, 15);
return 0;
}
//adds to the beginning of the linked list
void add2Beg(Node* head, int num)
{
//create a temporary location to hold the new entry
Node* temp = (Node *)malloc(sizeof(Node));
temp->iData = num;
if(head == NULL)
{
head = temp;
printf("inside add2Beg\n");
printf("%d\n", head->iData);
head->next = NULL;
printf("exiting add2Beg\n");
}
else
{
temp->next = head;
printf("%p\n", temp->next);
head = temp;
}
}
#包括
#包括
类型定义结构节点
{
int iData;
结构节点*下一步;
}节点;
void add2Beg(节点*头,整数);
int main(int argc,char const*argv[]
{
Node*head=NULL;
添加2个样本(头,5);
if(head==NULL)
printf(“头部无任何内容!!!\n”);
否则{
printf(“非空\n”);
}
添加2个样本(头,15);
返回0;
}
//添加到链接列表的开头
void add2Beg(节点*头,整数)
{
//创建临时位置以保存新条目
Node*temp=(Node*)malloc(sizeof(Node));
temp->iData=num;
if(head==NULL)
{
压头=温度;
printf(“内部添加2betg\n”);
printf(“%d\n”,head->iData);
head->next=NULL;
printf(“退出add2Beg\n”);
}
其他的
{
温度->下一步=头部;
printf(“%p\n”,临时->下一步);
压头=温度;
}
}
因为add2Beg()
中的head
变量是该函数的本地变量。为其指定新指针值(head=temp;
)只会更改函数中的head
变量。您需要传入一个指向指针的指针:
void add2Beg(Node** head, int num)
然后在函数中使用*head
:
if(*head == NULL)
{
*head = temp;
注意像head->next=NULL这样的行代码>--应该重写为(*head)->next=NULL代码>或(**头)。下一步=空代码>
等等。然后调用函数,如下所示:
add2Beg(&head, 15);
因为add2Beg()
中的head
变量是该函数的本地变量。为其指定新指针值(head=temp;
)只会更改函数中的head
变量。您需要传入一个指向指针的指针:
void add2Beg(Node** head, int num)
然后在函数中使用*head
:
if(*head == NULL)
{
*head = temp;
注意像head->next=NULL这样的行代码>--应该重写为(*head)->next=NULL代码>或(**头)。下一步=空代码>
等等。然后调用函数,如下所示:
add2Beg(&head, 15);
函数add2beg在修改时不会返回新的头。将您的功能更改为:
Node * add2Beg(Node* head, int num)
并在末尾返回头部:
return head;
函数add2beg在修改时不会返回新的头。将您的功能更改为:
Node * add2Beg(Node* head, int num)
并在末尾返回头部:
return head;
因为你从来没有给头赋值过,除了NULL
//here you set it to NULL then pass it to your function
Node *head = NULL;
add2Beg(head, 5);
在你的函数中,你传递一份“head”
此时,您将temp分配给它,因此在这个函数的范围内,它是vaid,但一旦您离开这个函数,它将返回NULL
您传入了指针“head”的副本,并称之为“head”。您需要返回值并在main()
中赋值,或者将指向head的指针传递到此函数中,以便更新值
解决方案:
Node *head = NULL;
head = add2Beg(head, 5);
Node* add2Beg(Node* head, int num){
...
return head;
或
因为你从来没有给头赋值过,除了NULL
//here you set it to NULL then pass it to your function
Node *head = NULL;
add2Beg(head, 5);
在你的函数中,你传递一份“head”
此时,您将temp分配给它,因此在这个函数的范围内,它是vaid,但一旦您离开这个函数,它将返回NULL
您传入了指针“head”的副本,并称之为“head”。您需要返回值并在main()
中赋值,或者将指向head的指针传递到此函数中,以便更新值
解决方案:
Node *head = NULL;
head = add2Beg(head, 5);
Node* add2Beg(Node* head, int num){
...
return head;
或
哼!这些指针!谢谢你指出错误:)呸!这些指针!谢谢你指出错误:)谢谢!我认为这种实现方法比使用@cdhowieThanks建议的指针到指针方法更容易!我认为这种实现方法比使用@cdhowie建议的指针到指针的方法更容易。我已经修复了您的格式设置。为便于将来参考,请尽量避免将选项卡粘贴到代码块中。他们几乎总是把间距弄乱。我已经修正了你的格式。为便于将来参考,请尽量避免将选项卡粘贴到代码块中。他们几乎总是把间隔搞得一团糟。