将项目添加到链接列表的末尾 - >错误

时间:2014-12-03 17:02:53

标签: c

我的C程序功能有问题。功能的想法是将一个项目(newval)添加到链接列表的末尾。这是我的代码(也可以用它找到评论):

#include <stdlib.h>

struct list
{

    int val;
    struct list *next; 
};

void add_to_list(struct list *l, int newval)

{

    if (!l) return;  //my fried said that I should add this, but I dont really understand why.
                     //and should it be if(l == NULL) rather than if(!l)? 
    while(l->next !=NULL) // I am pretty sure that this while loop is correct
       l=l->next; 
    l->next = malloc(sizeof(int)) //hmm... is this correct way to allocate memory
    l->next->val = newval;  //not sure about this
    l->next->next = NULL; //This should be fine
}

3 个答案:

答案 0 :(得分:2)

l->next = malloc(sizeof(int));

您需要为结构分配内存而不是int

l->next = malloc(sizeof(struct list));

if(!l)if(l == NULL)

相同

答案 1 :(得分:0)

你应该分配

l->next = malloc(sizeof(struct list)); 

而不是

l->next = malloc(sizeof(int));

并用零初始化分配的内存:

memset(l->next, 0, sizeof(struct list));

答案 2 :(得分:0)

    void add_to_list(struct list *l, int newval)

您的函数声明为void。这意味着没有办法 你发出错误信号的功能。样本代码不是问题, 但绝对是你应该至少知道的事情。

    if (!l) return;  //my fried said that I should add this,
                     //and should it be if(l == NULL) rather than if(!l)?

构造(!l)完全等同于(l != NULL)。这个 是因为NULL被定义为“空指针常量”,并且 “空指针常量”是“带有的整数常量表达式 值0,或类似表达式转换为void * “。在其他情况下 单词,NULL评估为零。

    while(l->next !=NULL) // I am pretty sure that this while loop is correct
        l=l->next;

是的,这个while循环是正确的。循环完成后,l将会 指向列表中的最后一个元素。

    l->next = malloc(sizeof(int)) //hmm... is this correct way to allocate memory

您的分配几乎是正确的。你正在分配足够的存储空间 保持一个int,但你真的需要足够的存储来容纳一个 struct list。请改用l->next = malloc(sizeof(struct list));

    l->next->val = newval;  //not sure about this

这里没有错误。这与下一行完全一样正确。

    l->next->next = NULL; //This should be fine

是的,这很好..


但是,虽然此部分代码大部分都是正确的,但除非已涵盖malloc(),否则

    l->next = malloc(sizeof(int)) //hmm... is this correct way to allocate memory
    l->next->val = newval;  //not sure about this
    l->next->next = NULL; //This should be fine

这里使用的方法有点不寻常。这是因为 分配新内存时,您将分配指针 直接到l->next然后初始化它。

更常见的做法是声明一个指针,如 struct list *tmp = NULL在函数的开头, 分配时,将新内存分配给tmp。然后, 初始化tmp指向的新列表元素,和 然后才将现在初始化的新列表元素添加到 列表的末尾。虽然这涉及更多的代码, 它分离了创建新列表元素的两个步骤 并将该元素添加到列表的末尾。

    void add_to_list(struct list *l, int newval)
    {
        struct list *tmp = NULL;

        if (!l) return;  // If no valid list, return.

        tmp = malloc(sizeof(struct list)); // Allocate new list element
        tmp->val = newval;                 // and fill it up.
        tmp->next = NULL;   // End of the list always points nowhere.

        while(l->next !=NULL) // find end of list.
            l=l->next;

        l->next = tmp; // Attach new list element to end.

        return;
    }

此外,这样做可以避免可能出现的混乱 通过l->next指针分配值。