代码之家  ›  专栏  ›  技术社区  ›  devoured elysium

是否有针对C的标准队列实现?

  •  7
  • devoured elysium  · 技术社区  · 14 年前

    是否有任何与C一起“附带”的队列数据结构实现,或者我必须自己开发(这是针对学校项目的,因此我必须使用标准GCC安装中存在的或必须自己实现的东西!)

    其他一般的数据结构,如链表、堆栈等,怎么办?

    谢谢

    8 回复  |  直到 8 年前
        1
  •  2
  •   Pascal Cuoq    11 年前

    你必须实现你自己的。C在数据结构方面几乎没有什么优势,它迫使您使用有争议的技巧来实现抽象数据类型:请参阅一篇题为“不完整类型作为抽象”的文章,如果您能找到它,或者看看这些原则是如何应用的,比如, PolarSSL's bignum.h file . 另一方面,C++允许你在C中做很多事情,并给出实现抽象数据结构的方法。

        2
  •  22
  •   Sudhanshu    14 年前

    试试这个。Unix附带了几种链接列表——您可以使用其中一种来创建其他可能基于列表的结构,如堆栈。

    man queue
    
        3
  •  2
  •   Bernardo Ramos    8 年前

    不,但这里有一个非常简单的实现:

    typedef struct node {
       int val;
       struct node *next;
    } node_t;
    
    void enqueue(node_t **head, int val) {
       node_t *new_node = malloc(sizeof(node_t));
       if (!new_node) return;
    
       new_node->val = val;
       new_node->next = *head;
    
       *head = new_node;
    }
    
    int dequeue(node_t **head) {
       node_t *current, *prev = NULL;
       int retval = -1;
    
       if (*head == NULL) return -1;
    
       current = *head;
       while (current->next != NULL) {
          prev = current;
          current = current->next;
       }
    
       retval = current->val;
       free(current);
    
       if (prev)
          prev->next = NULL;
       else
          *head = NULL;
    
       return retval;
    }
    

    完整来源 here

        4
  •  0
  •   Paul Rubel    14 年前

    你可以使用 named pipe . 它是一个FIFO数据结构,是POSIX标准的一部分。如果你只想从后面扭到前面,那就行了。不过,您需要手动跟踪消息边界,可能需要让第一个元素是下一条消息中的字节数。

        5
  •  -1
  •   swegi    14 年前

    您必须实现自己的数据结构,但外面存在许多数据结构库。

        6
  •  -1
  •   Clifford    14 年前

    如果这是一个“学校项目”,那么实现您自己的数据结构可能在标记方案上,使用图书馆调用可能会阻止审查员授予这些标记。

    iso c标准库不包含这样的数据结构,但是gnu libc不仅仅包含iso标准。这包括 Pipes and FIFOs 可以满足您的要求。

        7
  •  -1
  •   eadmaster    9 年前

    不是严格的标准,但许多系统 bsd/sys/queue.h bsd/sys/tree.h 这是基于宏的库。

    documentation here .

        8
  •  -1
  •   Paul    9 年前

    使用BSB LIB。sys/queue.h和sys/tree.h 实现各种列表和树。