佇列(連結串列實現)概念及相關函式
阿新 • • 發佈:2019-02-06
一. 連結串列佇列
特殊的單鏈表,只在單鏈表上進行頭刪尾插的操作
二. 相關函式
對於佇列具體概念不太清楚的同學可以參考
順序表實現的資料結構佇列
由順序表實現的佇列程式結構相對來說比較簡單,可以鞏固一下基礎
連結串列定義的佇列結構
#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