乙個通用純C佇列的實現

2021-06-22 11:56:30 字數 1628 閱讀 9531

佇列並不是很複雜的資料結構,但是非常實用,這裡實現乙個佇列是因為在我的另一篇部落格非常精簡的linux執行緒池實現中要用到。

佇列api定義如下:

#ifndef queue_h_included

#define queue_h_included

typedef struct queue *queue_t;

queue_t queue_create();

int queue_isempty(queue_t q);

void* queue_enqueue(queue_t q, unsigned int bytes);

void* queue_dequeue(queue_t q);

void queue_destroy(queue_t q);

#endif //queue_h_included

佇列api提供的功能有:建立佇列,判斷佇列是否為空,入隊,出隊,銷毀佇列。這個佇列是通用的,不針對特定資料型別,它裡面儲存的元素是void*型別的指標。注意這個佇列跟普通佇列的入隊操作有所不同。普通佇列的入隊操作通常如下:

struct type *p;

p = malloc(sizeof(struct type));

p->a = ...;

p->b = ...;

p->c = ...;

...queue_enqueue(q, p);

而這裡的入隊操作簡化了流程:

struct type *p;

p=queue_enqueue(q, sizeof(struct type));

p->a = ...;

p->b = ...;

p->c = ...;

...

另外雖然佇列元素(指標)所指向的記憶體空間是在入隊操作時由佇列分配的,但是佇列元素出隊以後,佇列並不負責元素所指向記憶體空間的釋放,佇列使用者應該自己手動釋放記憶體。

佇列的實現如下:

#include "queue.h"

#include struct node ;

struct queue ;

queue_t queue_create()

int queue_isempty(queue_t q)

void* queue_enqueue(queue_t q, unsigned int bytes)

void* queue_dequeue(queue_t q)

element=tmp->element;

q->front.next=tmp->next;

free(tmp);

if(q->front.next==null)

return element;

}void queue_destroy(queue_t q)

free(q); // 感謝@toudsour指正

}

應用程式使用佇列時只需要包含queue.h標頭檔案,並在編譯時將queue.c一起編譯就行了。因為佇列的宣告和實現是嚴格分離的,包含queue.h的應用程式無法也不應該通過佇列指標直接訪問佇列結構體的成員。

乙個通用純C佇列的實現

佇列並不是很複雜的資料結構,但是非常實用,這裡實現乙個佇列是因為在我的另一篇部落格非常精簡的linux執行緒池實現中要用到。佇列api定義如下 ifndef queue h included define queue h included typedef struct queue queue t q...

c 實現乙個簡單的迴圈佇列

實現乙個迴圈佇列 佇列的特點就是先進先出,尾插頭出。涉及到迴圈,無論是陣列還是鍊錶,重點在於取餘!防止溢位。例如陣列大小為5,當隊尾為4時,且 隊頭!隊尾 再入隊後,隊尾應改變為0,需用取餘。include using namespace std class queue 析構函式 queue 拷貝構...

C 實現乙個簡易的阻塞佇列

阻塞佇列是多執行緒中常用的資料結構,對於實現多執行緒之間的資料交換 同步等有很大作用。阻塞佇列常用於生產者和消費者的場景,生產者是向佇列裡新增元素的執行緒,消費者是從佇列裡取元素的執行緒。簡而言之,阻塞佇列是生產者用來存放元素 消費者獲取元素的容器。考慮下,這樣乙個多執行緒模型,程式有乙個主線程 m...