鏈式佇列由環形鍊錶實現,通過煉表頭和鍊錶尾的操作,完成了隊列入列出列的功能。
如圖所示,空佇列時至少需要乙個空節點,表示為佇列頭和佇列尾,相當於哨兵的作用;
入列:新增節點插入到佇列尾,並更新 tail 指標;出列:更新 head 位置,釋放原來 head節點,返回現有位置的 data;
相關資料結構
struct list_node_t ;
typedef struct queue
queue_t;
初始化函式,對於生成圖1的空佇列,注意初始化時尾節點指向頭節點
queue_t *queue_alloc(size_t max_size)
/* head is nil */
pqueue->head = calloc(1, sizeof(struct list_node_t));
if ( !pqueue->head )
pqueue->head->next = null;
pqueue->head->data = null;
/* reset tail means empty */
pqueue->tail = pqueue->head;
pqueue->max_size = max_size;
pqueue->used_num = 0;
return pqueue;
}
入列操作,對於圖2的步驟,新增節點後加入到佇列尾
int queue_push(queue_t *pqueue, void *nill, void *pdata)
if ( queue_isfull(pqueue) )
pnode = calloc(1, sizeof(struct list_node_t));
if ( !pnode )
pnode->data = pdata;
pnode->next = null;
pqueue->tail->next = pnode;
pqueue->tail = pnode;
pqueue->used_num++;
return success;
}
出列操作,對應圖3步驟,注意data資料為外部維護的資料結構,佇列內部只做索引維護。
void *queue_pop(queue_t *pqueue)
if ( queue_isempty(pqueue) )
prev = pqueue->head;
pqueue->head = pqueue->head->next;
free_pointer(prev);
return pqueue->head->data;
}
相比於資料佇列,鏈式佇列空間使用較少,同樣也可用於單生產者-單消費者的無鎖佇列實現。
注意data資料為外部維護的資料,佇列內部只是做指標索引管理,並不進行內容的修改。
資料結構 鏈式佇列的實現(C語言)
佇列的鏈式儲存稱為鏈式佇列。鏈式佇列就是乙個特殊的單鏈表,對於這種特殊的單鏈表,它的插入和刪除操作規定在單鏈表的不同端進行。鏈式佇列的隊首和隊尾指標分別用front和rear表示。鏈式佇列要掌握以下基本操作 1 建立乙個空的鏈式佇列 2 判斷鏈式佇列是否為空 3 輸出鏈式佇列各個結點的值 4 取得鏈...
C語言實現資料結構 鏈式佇列
define elemtype int typedef struct queuenode qnode typedef struct linkqueue linkqueue void initqueue linkqueue q 因為是鍊錶所以不需要判斷隊滿 void enqueue linkqueue...
c 資料結構 鏈式佇列
1.標頭檔案 includeusing namespace std struct linknode linknode const int x,linknode ptr null date x link ptr class linkedqueue 建構函式 構造空佇列 void makeempty 將...