为什么此链接列表代码始终为null?

时间:2012-09-20 19:02:58

标签: 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 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;
    }

}

3 个答案:

答案 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){
    ...