1. 程式人生 > >佇列(連結串列實現)概念及相關函式

佇列(連結串列實現)概念及相關函式

一. 連結串列佇列

特殊的單鏈表,只在單鏈表上進行頭刪尾插的操作

二. 相關函式

對於佇列具體概念不太清楚的同學可以參考

順序表實現的資料結構佇列
由順序表實現的佇列程式結構相對來說比較簡單,可以鞏固一下基礎

連結串列定義的佇列結構

#define Datatype char   // 佇列儲存資料的型別

// 佇列的節點
typedef struct LinkNode {
    Datatype data;
    struct LinkNode* next;
}LinkNode;

// 隊首隊尾指標
typedef struct LinkQueue {
    LinkNode* head;
    LinkNode* tail;
}LinkQueue;

LinkQueue.h

#pragma once
// 連結串列實現的佇列,後進先出
#include <stdlib.h>
#include <errno.h>
#include <stddef.h>

#define Datatype char


typedef struct LinkNode {
    Datatype data;
    struct LinkNode* next;
}LinkNode;

typedef struct LinkQueue {
    LinkNode* head;
    LinkNode* tail;
}LinkQueue;

// 初始化佇列
void LinkQueueInit(LinkQueue* queue); // 銷燬佇列 void LinkQueueDestroy(LinkQueue* queue); // 入佇列,尾插 int LinkQueuePush(LinkQueue* queue, Datatype value); // 出佇列,頭刪 int LinkQueuePop(LinkQueue* queue); // 取隊首元素 int LinkQueueTop(LinkQueue* queue, Datatype* value);

LinkQueue.c

#include "LinkQueue.h"

// 建立節點
LinkNode* Creat(Datatype value) { LinkNode* node = malloc(sizeof(LinkNode)); node->data = value; node->next = NULL; return node; } // 銷燬節點 void Destroy(LinkNode* node) { // 非法輸入 if(node == NULL) { perror("Creat"); return; } free(node); } // 初始化佇列 void LinkQueueInit(LinkQueue* queue) { // 非法輸入 if(queue == NULL) { perror("Init"); return; } queue->head = NULL; queue->tail = NULL; } // 銷燬佇列 void LinkQueueDestroy(LinkQueue* queue) { // 非法輸入 if(queue == NULL) { perror("Destroy"); return; } // 銷燬建立的連結串列節點 LinkNode* cur = queue->head; while(cur != NULL) { LinkNode* tmp = cur; cur = cur->next; Destroy(tmp); } // 銷燬連結串列 queue->head = NULL; queue->tail = NULL; } // 入佇列,尾插 int LinkQueuePush(LinkQueue* queue, Datatype value) { // 非法輸入 if(queue == NULL) { perror("Push"); return; } // 空連結串列 if(queue->head == NULL) { queue->head = queue->tail = Creat(value); return 1; } // 建立新節點 LinkNode* new_node = Creat(value); queue->tail->next = new_node; queue->tail = new_node; return 1; } // 出佇列,頭刪 // LinkQueue->node == NULL 代表空連結串列 int LinkQueuePop(LinkQueue* queue) { // 非法輸入 if(queue == NULL) { perror("Pop"); return 0; } // 空連結串列 if(queue->head == NULL) { return 0; } // 一個節點 if(queue->head == queue->tail) { // 銷燬節點 Destroy(queue->head); queue->head = queue->tail = NULL; return 1; } LinkNode* tmp = queue->head; queue->head = queue->head->next; Destroy(tmp); } // 取隊首元素 int LinkQueueTop(LinkQueue* queue, Datatype* value) { // 非法輸入 if(queue == NULL) { perror("Top"); return 0; } // 空佇列 if(queue->head == NULL) { return 0; } *value = queue->tail->data; return 1; } /* *************************************************** ********************* test ********************** * ***************************************************/ #if 1 #include <stdio.h> #define FUNCTION() printf("\n================ %s ===============\n", __FUNCTION__) // 佇列列印 void print(LinkQueue queue, const char* msg) { printf("%s\n", msg); // 非法輸入 if(queue.head == NULL) { perror("printf"); return; } LinkNode* cur = queue.head; while(cur != queue.tail) { printf("%c\n", cur->data); cur = cur->next; } printf("%c\n", cur->data); } // 入佇列測試 void TestPush() { FUNCTION(); LinkQueue queue; LinkQueueInit(&queue); LinkQueuePush(&queue, 'a'); LinkQueuePush(&queue, 'b'); LinkQueuePush(&queue, 'c'); LinkQueuePush(&queue, 'd'); print(queue, "入佇列"); } // 出佇列測試 void TestPop() { FUNCTION(); LinkQueue queue; LinkQueueInit(&queue); LinkQueuePush(&queue, 'a'); LinkQueuePush(&queue, 'b'); LinkQueuePush(&queue, 'c'); LinkQueuePush(&queue, 'd'); print(queue, "入佇列"); LinkQueuePop(&queue); print(queue, "出佇列一個"); LinkQueuePop(&queue); print(queue, "出佇列兩個"); LinkQueuePop(&queue); print(queue, "出佇列三個"); LinkQueuePop(&queue); print(queue, "出佇列四個"); LinkQueuePop(&queue); print(queue, "空佇列佇列"); } // 獲取隊首元素測試 void TestTop() { FUNCTION(); LinkQueue queue; LinkQueueInit(&queue); LinkQueuePush(&queue, 'a'); LinkQueuePush(&queue, 'b'); LinkQueuePush(&queue, 'c'); print(queue, "入佇列"); Datatype value; int ret = LinkQueueTop(&queue, &value); printf("ret is %d, top is %c\n", ret, value); ret = 0; // 獲取已銷燬佇列隊首元素 LinkQueueDestroy(&queue); ret = LinkQueueTop(&queue, &value); printf("ret is %d, top is %c\n", ret, value); } int main() { TestPush(); TestPop(); TestTop(); return 0; } #endif