用C语言实现链表的设计选择

用C语言实现链表的设计选择,c,pointers,linked-list,heap,dynamic-memory-allocation,C,Pointers,Linked List,Heap,Dynamic Memory Allocation,我希望这个问题对于这个网站的格式来说不是太开放。我对C有点陌生,喜欢用它来学习它的复杂性。我目前的“任务”是建立一个单链表 这是我的设置:链表程序的第一次迭代将所有节点存储在一个连续的内存块中。我的推送和弹出功能需要realloc 然而,当我开始使用realloc时,我决定尝试一种新的设计,在创建或删除单个节点的过程中分别调用malloc和free。我已经读到,在更大的范围内,这可能会对项目造成很大的阻碍 哪种方法更好,第一种还是第二种?或者这两种想法都适用于某些实现?请原谅,如果这太宽泛了,我

我希望这个问题对于这个网站的格式来说不是太开放。我对C有点陌生,喜欢用它来学习它的复杂性。我目前的“任务”是建立一个单链表

这是我的设置:链表程序的第一次迭代将所有节点存储在一个连续的内存块中。我的推送和弹出功能需要realloc

然而,当我开始使用realloc时,我决定尝试一种新的设计,在创建或删除单个节点的过程中分别调用malloc和free。我已经读到,在更大的范围内,这可能会对项目造成很大的阻碍


哪种方法更好,第一种还是第二种?或者这两种想法都适用于某些实现?请原谅,如果这太宽泛了,我只是想检查我的理解,真正了解如何设计程序。

你的第二种方法是“经典”链接列表。依次对每个节点进行malloc。每个节点都有一个指向下一个节点的指针。最后一个指针的下一个指针为空。您有一个指向第一个节点的根指针

这不存在规模问题;现代堆管理器非常高效。然而,有一个大脑规模的问题。您需要编写干净的代码,这样才能避免泄漏或崩溃:-)


如果您在linux上执行此操作,请学习如何使用名为valgrind的工具。(当然还要学习如何使用gdb)

如果节点是一个连续块,那么它实际上不是一个链表。那只是一个数组:)(mind=blow)我喜欢最基本的。谢谢!现在,在我当前的实现中,我的根节点是一个普通节点,它也“加倍”(npi)作为“承载”(值保持)节点。有那个额外的节点是一种好的做法吗?我不会这么做——这意味着根节点不在堆上,因此必须以不同的方式进行管理,而是使用一个名为ListHead的节点指针或列表名称(Customers,ShoeSizes,…)(mind=2*Blow)我不敢相信我之前没有注意到这种区别。我当前拥有的根指针仍在堆栈上!实际上,现在我看一下我的特定代码,这个根指针已经是
结构列表中的单个元素了。因此,当指针位于堆上时,现在我至少知道根节点直接连接到
struct List
。尽管如此,这仍然是一个很好的区别。