佇列並不是很複雜的資料結構,但是非常實用,這裡實現乙個佇列是因為在我的另一篇部落格非常精簡的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...