繁体   English   中英

是否有C的标准Queue实现?

[英]Are there standard Queue implementations for C?

是否有C附带的任何队列数据结构实现,还是我必须开发自己的(这是针对学校项目的,因此,我必须使用标准gcc安装中已经存在的某种东西,或者必须由我自己实现! )

其他一般数据结构(如链表,堆栈等)如何?

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

man queue

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

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;
}

完整的源代码在这里

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

您必须实现自己的。 C在数据结构方面几乎没有什么优势,它迫使您诉诸可疑的技巧来实现抽象数据类型:如果可以找到,请参见标题为“不完整的类型作为抽象”的文章,或者查看原理在其中的应用,例如, PolarSSL的bignum.h文件 另一方面,C ++应该允许您执行几乎可以用C进行的所有操作,并为您提供实现抽象数据结构的方法。

并非完全标准,但是许多系统具有基于宏的库bsd/sys/queue.hbsd/sys/tree.h

请参阅此处文档

您可以使用命名管道 它是FIFO数据结构,是posix标准的一部分。 如果您所有的需求都向后倾斜并从正面移开,则可以使用。 但是,您可能需要手动跟踪消息边界,也许是通过使第一个元素为下一条消息中的字节数。

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

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

用一次实现queue的方式编写您自己的头文件,例如queue.h,然后将该文件放入包含头文件的文件夹中。 这将在以后需要队列时为您提供帮助。

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

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

ISO C标准库不包含此类数据结构,但GNU libc不仅涵盖ISO标准。 这包括可满足您要求的管道和FIFO

暂无
暂无

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

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