是否有C的标准Queue实现?

时间:2010-11-15 13:48:38

标签: c unix data-structures

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

如链接列表,堆栈等其他常规数据结构呢?

由于

9 个答案:

答案 0 :(得分:22)

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

man queue

答案 1 :(得分:2)

你必须实现自己的。 C在数据结构方面很少,并且迫使您采用可论证的技巧来实现抽象数据类型:如果您能找到它,请参阅标题为“不完整类型为抽象”的文章,或者查看原则如何应用于,例如, PolarSSL's bignum.h file。另一方面,C ++应该允许你在C中做几乎所有的事情,并为你提供实现抽象数据结构的方法。

答案 2 :(得分:2)

没有。但这是一个非常简单的实现:

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

答案 3 :(得分:0)

您可以使用named pipe。它是FIFO数据结构,是posix标准的一部分。如果你想要的只是后面的enque并从前面移除它将工作。您需要手动跟踪消息边界,可能是将第一个元素作为下一条消息中的字节数。

答案 4 :(得分:0)

GLib(不要与glibc混淆)实现了许多常见的数据结构,包括双端队列。与FreeBSD's macro-based queues不同,GLib's GQueues基于函数,这些函数可能更易于调试和类型检查。

https://developer.gnome.org/glib/stable/glib-Double-ended-Queues.html

答案 5 :(得分:-1)

您必须实现自己的数据结构,但那里有许多数据结构库。

答案 6 :(得分:-1)

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

ISO C标准库不包含此类数据结构,但GNU libc不仅涵盖ISO标准。这包括可能符合您要求的Pipes and FIFOs

答案 7 :(得分:-1)

不是标准的,但许多系统都有bsd/sys/queue.hbsd/sys/tree.h基于宏的库。

请参阅documentation here

答案 8 :(得分:-1)

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