Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么这个链表代码总是导致head为null?_C_Linked List - Fatal编程技术网

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建议的指针到指针的方法更容易。我已经修复了您的格式设置。为便于将来参考,请尽量避免将选项卡粘贴到代码块中。他们几乎总是把间距弄乱。我已经修正了你的格式。为便于将来参考,请尽量避免将选项卡粘贴到代码块中。他们几乎总是把间隔搞得一团糟。