[英]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进行的所有操作,并为您提供实现抽象数据结构的方法。
您可以使用命名管道 。 它是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.