c - 链表辅助

标签 c list pointers linked-list computer-science

<分区>

我正在使用 C 语言编写一个带有插入和打印功能的链表。但是,我从插入中得到了一个段错误,当我试图解决这个问题时,我最终得到了一个来自打印函数的错误。任何帮助将不胜感激。

    typedef struct node
    {
        struct node *next;
        double value;
    } NodeT, *NodeTP;

    int listSize = 0;

    int insert(NodeT *firstEle, int value)
    {
        NodeTP temp;

        if((temp = (NodeTP)malloc(sizeof(NodeT))) == NULL)
        {
            return 0;
        }

        // first node in the list.
        if(listSize == 0)
        {
            firstEle->value = value;
            firstEle->next = NULL;
        }
        // finds the end node and adds the new node to the list.
        else
        {
            while(temp != NULL)
            {
                temp = temp->next;
            }

            temp->value = value;
            temp->next = firstEle;
            firstEle = temp;
        }

        listSize++;
        return 1;
    }

    int print(NodeT List)
    {
        printf("Element: %.2f\n", List.value);
        return 1;
    }

    int main(int argc, char* argv[])
    {
        // creates the list.
        NodeTP list;

        if((list = (NodeTP)malloc(sizeof(NodeT))) == NULL)
        {
            return 0;
        }

        list = NULL;

        insert(list, 5);

        print(list[0]);

        insert(list, 15);

        print(list[1]);

        return EXIT_SUCCESS;
    } 

最佳答案

打印问题

当谈到打印语句时,您使用了无效的语法。您创建了一个指针并为该指针及其指向的内容分配了足够的内存。您没有创建 NodeT 元素数组。因此,list[x] 将不起作用。

您需要生成一个函数,用于在您创建的列表中定位“x”元素。您可以将其包含在您编写的 print 函数中。只需将其更改为您想要的元素的 int 即可:

int print(NodeT head, int element) {}

如果请求的元素超出当前范围,请不要忘记检查边界。

然后您真正需要做的就是通过元素逐步找到所需的元素。

插入问题

在您的 if/else 语句中,您为什么要遍历“temp”? 'temp' 是在此函数中创建的,不应附加任何其他元素。您应该遍历“firstEle”。您也不想设置 firstEle = temp;,因为这会覆盖之前的内容,而您现在指向其他内容。

简化此代码的一种方法是使用头部和尾部。头部永远不会改变,但尾部会随着元素的添加而移动。您可以让“插入”返回尾部,当您插入新元素时,只需提供尾部,新元素就会添加到那里,无需迭代。

内存问题

虽然这对这个程序来说不是主要的,但我会调整我 malloc 我的新节点的位置,直到我确保它不是第一个元素之后。否则,您分配了一个从未使用过的 block 。或者,如果这是要添加的第一个元素,则释放该 block 。

Fred 提出了一个很好的观点。这会导致问题。

关于c - 链表辅助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23941000/

相关文章:

python - 创建单个列表项的列表乘以 n 次

c - c中的表达式

c++ - 为什么最后一个十进制数字为 5 的 float 在浮点比较中给出正确的输出,而在其他情况下却不是?

c++ - 在 Linux 上监视目录的程序

css - 使最后一个内联列表项扩展容器的剩余宽度

python - 表达式的字典列表

c - 当我用 C 编译时,头文件中出现导入错误

c - 为什么 C 中的一个 printf() 不能同时打印两个 64 位值?

c - 我应该如何在心理上解析这个陈述?

c - C 中的指针数组