c語言資料結構實現 鏈式佇列

2021-07-25 11:10:07 字數 1586 閱讀 2883

鏈式佇列由環形鍊錶實現,通過煉表頭和鍊錶尾的操作,完成了隊列入列出列的功能。

如圖所示,空佇列時至少需要乙個空節點,表示為佇列頭和佇列尾,相當於哨兵的作用;

入列:新增節點插入到佇列尾,並更新 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 將...