使用通用列表

时间:2010-12-20 11:04:52

标签: c

struct node 
{ 
    void *data; 
    struct node *link;    
}; 

鉴于这样的结构,我们将其称为通用链表。在实时应用程序使用方面,使用这样的列表是什么。

3 个答案:

答案 0 :(得分:2)

它的通用性允许您在其周围创建一些(经过测试且可靠的)库代码,然后可以重复使用它们。

当然,这种方式并不是类型安全的,这就是为什么C ++引入(以及其他)通用模板类的原因。

至于链接列表本身的使用:您可以在想要存储和检索可变数量的类似对象的地方使用它。通常,您事先不知道对象的数量,并且可以按照存储它们的顺序获取它们。从链表中删除对象也很有效(一旦有了指向其列表条目的指针)。

答案 1 :(得分:1)

  

在实时应用程序使用方面,这种列表的用途是什么

如果您拥有的只是该定义和指向列表头部的指针,那么它仅适用于创建任意堆栈的对象。这是因为除了在列表的头部添加或删除对象之外,您必须执行任何操作。即使有这种有限的“效率”,这样的列表也有其用途,例如:作为要回收的未使用堆对象的缓存,以避免mallocs。

如果您还有指向列表尾部的指针,则可以在O(1)时间内将对象添加到任一端。这意味着您可以将其用作队列。

如果每个项目都有指向其前任和后继的指针,您还可以在O(1)时间内从列表中的任何点插入/删除项目。当然,您仍然需要找到可能涉及线性扫描的对象。

答案 2 :(得分:1)

您有一项服务接受来自多个应用程序的请求,并为每个应用程序提供句柄。该服务可以在链表中维护每个请求的上下文,并且当它完成服务时,从列表中删除该节点。在这种情况下,空链表将意味着没有应用程序注册到服务。

对于例如,考虑在SIP stack上构建的服务,并且IMPresence information等多个应用程序可以向使用SIP堆栈进行信令的服务注册。现在,该服务在链表中维护与每个应用程序相关的数据(这也是设计问题,但我们假设我们有限制为5个应用程序提供服务)。必须将SIP响应重定向到发送请求的应用程序,并假设您将回调指针保持为节点的一个值,一旦找到响应的相应节点,就很容易调用它。

每个节点都会保存有关每个应用程序的大量信息,并使用它将响应发送回应用程序。

您可能想查看this