2017-10-19 33 views
1

我被告知,这将无法正确地将节点添加到列表中,但我已经测试它,它似乎工作。任何人都可以让我知道这段代码中的错误吗?将元素添加到c中的列表开头的代码 - 错误是什么?

struct node { 
    int num; 
    struct node* next; 
}; 

void add_first(struct node* head, struct node* new_node) { 
    new_node->next = head; 
    head = new_node; 
} 

我试图回答的具体问题是:

一)此功能将无法得到期望的结果(即,添加节点)。什么是问题,什么时候发生?

为了尝试找到问题,我创建了四个节点,在它们上使用add_first函数,然后显示结果。不过,我似乎得到了正确的输出结果。这是我整个编写的程序,不包括上述功能:

void display(struct node* head) { 
    printf("%d ", head->num); 
    if(head->next == NULL) { 
     return; 
    } 
    display(head->next); 
} 

int main() { 
    struct node* n1; 
    struct node* n2; 
    struct node* n3; 

    n1 = (struct node*)malloc(sizeof(struct node*)); 
    n2 = (struct node*)malloc(sizeof(struct node*)); 
    n3 = (struct node*)malloc(sizeof(struct node*)); 

    n1->num = 1; 
    n2->num = 2; 
    n3->num = 3; 

    add_first(n1, n2); 
    add_first(n2, n3); 

    display(n3); 

    return 0; 
} 

我得到的输出是:

这似乎是正确的。所以,如果我得到正确的输出,为什么函数不能给出预期的结果?我没有看到它的问题。

+0

majar问题是,你不能更新调用者的节点。尝试更改API以使其更像'n1 = add_first(n1,n2);'(返回头部)并且其他问题是'sizeof(struct node *)' - >'sizeof(struct node)'并且'next'没有被初始化。 E.g'n1-> num = 1;' - >'n1-> num = 1; n1-> next = NULL;' – BLUEPIXY

回答

5

功能和测试程序是不正确的。

节点n1应该是不是头呢?但是,您显示的是通过节点n3而不是节点n1而不是节点的列表。

实际上,您建立了一个列表,其头部为n3,并将n2和n1添加到列表的尾部。

与功能

void add_first(struct node* head, struct node* new_node) { 
    new_node->next = head; 
    head = new_node; 
} 

的问题是,指针到节点head通过值传递。所以这个声明

head = new_node; 

处理一个原始头n1的副本。实际上该功能不会改变n1

您必须通过参考n1的头部。

正确的代码可以看至少像

void add_first(struct node **head, struct node *new_node) 
{ 
    new_node->next = *head; 
    *head = new_node; 
} 

考虑到,你必须设置数据成员添加的节点旁NULL帐户。这是主要的,你必须为每个创建的节点

n1->num = 1; 
n1->next = NULL; 
n2->num = 2; 
n2->next = NULL; 
n3->num = 3; 
n3->next = NULL; 

函数本身写将被称为像

add_first(&n1, n2); 

add_first(&n1, n3); 

在这种情况下,功能显示可称为正确传递给它的实际头

display(n1); 

考虑到,像这样

n1 = (struct node*)malloc(sizeof(struct node*)); 
             ^^^^^ 

声明是无效的。而不是指针,你必须分配的节点本身是

n1 = (struct node*)malloc(sizeof(struct node)); 
             ^^^^ 
+0

非常感谢!我错过了该函数正在处理复制而不是原始值的事实。你的解释非常有帮助。 – Kendra

+0

@Kendra根本没有。不用谢。:) –

0

add_first(node,NULL)将擦除头指针数据并给出错误。

和第二情况下,如果头是NULL add_first(NULL,node);

相关问题