【问题标题】:Why BSD queue.h LIST called a list?为什么BSD queue.h LIST 称为列表?
【发布时间】:2013-07-17 19:29:38
【问题描述】:

我的“母语”是 Java,出于教育目的,我需要用 C 编写一个项目。我尝试了解queue.h 库。在 Java 中,默认情况下 add()List 末尾的一个项目,但是在 queue.h 中只有 LIST_INSERT_HEAD 宏不接受其他成员。事实上,一个小测试表明它插入到了 HEAD(当使用LIST_FOREACH 遍历时,它从最后一个插入的元素到第一个元素)。那么,这不应该叫FILO队列(也就是栈)吗?

【问题讨论】:

    标签: c list data-structures queue bsd


    【解决方案1】:

    Java 中的列表对应于List ADT:“一个有序的值序列,其中相同的值可能出现多次”。

    queue.h中的LIST也是一个List ADT,在里面可以看到实现的细节(实现为双向链表)。它是 LIFO,正如 queue.h 文件所说的那样(虽然很模糊)。是的,实现Stack ADT 的一种方法是通过using a linked list

    【讨论】:

      【解决方案2】:

      您应该错过了其他人,INSERT_TAIL 必须在场。请进行查找并确认。

      它同时具有列表和队列的功能:)

      可能是下面,不是那个,反正你在找 http://bxr.su/o/queue.h

      【讨论】:

      • TAILQ 宏确实有INSERT_TAIL。但是List中没有这样的方法,所以对我来说很奇怪。
      • 是的,它是一种设计选择,要添加尾部,您必须使用 TAILQ,否则 LIST 可以。请不要与 Java LinkedList 混淆。
      【解决方案3】:

      queue.h 提供了许多队列选项。

      由于这一切都是由预处理器完成的,并且还要注意每个 BSD 系统上文件的完整路径是 src/sys/sys/queue.h,这意味着它在内核中大量用于内部结构,每个变体都高度针对效率和最低内存占用进行了优化。

      在 OpenBSD 上,似乎有多种队列可供选择(每个 BSD 系统在此处的选择可能略有不同):

      * 无论出于何种原因,目前看来 6 个选项中只有 4 个被正式记录在 manual page 中。 见:http://bxr.su/o/share/man/man3/queue.3

      如果您希望能够将INSERT_TAIL 加入队列/列表,您仍然可以从这里选择很多选项——SIMPLEQXSIMPLEQTAILQCIRCLEQ

      所以,总结:没有法律规定名为 LIST 的队列/列表实现必须允许尾部插入!

      【讨论】:

        猜你喜欢
        • 2016-07-05
        • 2012-03-07
        • 2018-08-04
        • 1970-01-01
        • 2022-01-24
        • 2021-12-21
        • 1970-01-01
        • 2015-07-24
        相关资源
        最近更新 更多