繁体   English   中英

我应该在ANSI C中使用什么来创建链接列表?

[英]What should I use in ANSI C to create linked lists?

在Java中,我使用LinkedList<T>

是否有任何标准或其他库来在C中创建LinkedList?

不,C没有这样的东西。 如果可以使用C ++,则有std::list

您必须自己用C编写结构。

就像其他人所说的那样,C中不存在对链接列表的标准库支持。这意味着您可以自己滚动(就像大多数人在C编码生涯中做过一次或多次)一样,或者您可以查看其他库为了支持。

对于大多数用途,您会发现“侵入式”实施是合适的。 您可以修改现有结构,使其包含指向列表中下一项的指针(如果要进行双向链接,则指向上一项)。

typedef struct TheStruct TheStruct;

struct TheStruct
{
    ...the real data...
    TheStruct *next;
  //TheStruct *prev;
};

现在,您的列表包含一个指向标题的简单指针:

TheStruct *head = 0;

TheStruct *allocated_node = new_TheStruct(value1, value2, ...);

assert(allocated_node->next == 0);

// Insert new allocated node at head of list
allocated_node->next;
head = allocated_node;

如果让线程访问同一列表,则必须担心线程问题,依此类推。

因为此代码非常简单,所以这是最常处理的方式。 从列表中删除节点比较麻烦,但是您可以编写一个函数来实现。

人们已经用复杂程度不同的宏修饰了这种基本方案,以便处理不同类型列表的代码可以使用相同的宏。 Linux内核使用基于宏的链接列表集来管理其链接列表数据结构。

“侵入式”实现的替代方案(之所以这样称呼是因为它需要更改结构以包括列表指针),它具有一些通用的列表机制:

typedef struct GenericList GenericList;
struct GenericList
{
    void        *data;
    GenericList *next;
  //GenericList *prev;
};

现在,您可以将(未指向)未修改的结构放入列表中。 您会失去一些类型安全性; 没有什么可以阻止您将随机不同的结构类型添加到应为同类的列表中。 您还必须与指向的数据分开为GenericList结构分配内存。

  • 这样的一个优点是单个数据项可以同时位于多个单独的列表中。 *这样的一个缺点是单个数据项可能意外地同时出现在多个列表中,或者一次出现在单个列表中多次。

您还必须确保您了解数据的所有权属性,以便正确释放数据(不泄漏,不多重释放,释放后不访问)。 比较而言,管理列表本身的内存是孩子的事。

使用GenericList机制,您可能会拥有一个函数库来为您管理列表操作。 再次,搜索应显示此类列表的实现。

C尚未提供标准容器结构。 您必须自己动手。

默认情况下不存在,但是可以很容易地使它。

基本上,链接列表是指向1st元素的标头指针和指向null的结束文件。

元素实际上是节点,包含对象和指向下一个节点的指针。

因此,尽管在C语言中没有类,而只有结构,但是制作一个基本的类很容易,尽管这样可能很痛苦。

标准C库中没有列表。 您可以使用的一个很好的C库是PBL- 这里的程序库。 它的接口类似于Java。 您可以从这里下载

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM