我已经实现了一个短链接列表代码,可以添加到列表的开头。
然而,头部始终包含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;
}
}
答案 0 :(得分:6)
因为head
内的add2Beg()
变量是该函数的本地变量。为其分配新的指针值(head = temp;
)只会更改函数内的head
变量。你需要传入一个指向指针的指针:
void add2Beg(Node** head, int num)
然后在函数中使用*head
:
if(*head == NULL)
{
*head = temp;
请注意head->next = NULL;
之类的行 - 这应该重写为(*head)->next = NULL;
或(**head).next = NULL;
。
等等。然后像这样调用函数:
add2Beg(&head, 15);
答案 1 :(得分:1)
你的函数add2beg在修改它的情况下没有返回新头。将您的功能更改为:
Node * add2Beg(Node* head, int num)
并在最后返回头部:
return head;
答案 2 :(得分:0)
因为您从未将头部分配给除NULL以外的任何内容......
//here you set it to NULL then pass it to your function
Node *head = NULL;
add2Beg(head, 5);
在您的函数中,您传递了一份&#34; head&#34;
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) //we'll get in here
此时你为它分配了temp,所以在这个函数的范围内它是vaid的东西,但是一旦你离开这个函数,它就会回到NULL。
你传入了一个副本指针&#34; head&#34;并且称它为#34; head&#34;。您需要返回值并在main()
中指定它,或者将指针传递给此函数,以便更新值。
解决方案:
Node *head = NULL;
head = add2Beg(head, 5);
Node* add2Beg(Node* head, int num){
...
return head;
OR
Node *head = NULL;
add2Beg(&head, 5);
void add2Beg(Node** head, int num){
...