C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之隊(duì)列的定義與實(shí)現(xiàn)
一、隊(duì)列的性質(zhì)
上次我們學(xué)習(xí)棧,了解到棧儲(chǔ)存釋放數(shù)據(jù)的方式是:先進(jìn)后出
而隊(duì)列與其相反,隊(duì)列是:先進(jìn)先出,后進(jìn)后出。
二、隊(duì)列的結(jié)構(gòu)
多個(gè)鏈表節(jié)點(diǎn) + 頭尾指針 (鏈表式隊(duì)列)
鏈表節(jié)點(diǎn)負(fù)責(zé)存儲(chǔ)數(shù)據(jù);頭節(jié)點(diǎn) 負(fù)責(zé)定位先進(jìn)的起始數(shù)據(jù),方便先出;
尾節(jié)點(diǎn)負(fù)責(zé)記錄尾部數(shù)據(jù),方便確定隊(duì)列當(dāng)前狀態(tài)。
三、代碼實(shí)現(xiàn)
頭文件
這里方便統(tǒng)一調(diào)用,將頭尾指針定義成一個(gè)結(jié)構(gòu)體 。
#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<stdbool.h> typedef int Quetype; //定義隊(duì)列的數(shù)據(jù)類型 typedef struct QueNode //定義數(shù)據(jù)節(jié)點(diǎn) { struct QueNode* Next; Quetype data; }QueNode; typedef struct Quetail { struct QueNode* head; //定義頭尾指針 struct QueNode* tail; }Quetail; void Que_Init(Quetail* pq); //隊(duì)列的初始化 void Que_Destory(Quetail* pq); //隊(duì)列的銷毀 void Que_push(Quetail* pq ,Quetype data); //插入數(shù)據(jù) void Que_pop(Quetail* pq); //刪除數(shù)據(jù) bool Que_Empty(Quetail* pq); //判斷隊(duì)列是否為空 int Que_size(Quetail* pq); //統(tǒng)計(jì)隊(duì)列長(zhǎng)度 int Que_front(Quetail* pq); //查找隊(duì)列的頭部數(shù)據(jù)
功能函數(shù)
1.隊(duì)列的初始化:
將頭尾指針置為NULL 方便后續(xù)使用。
void Que_Init(Quetail* pq) //隊(duì)列的初始化 { assert(pq); pq->head = pq->tail = NULL; }
2.插入數(shù)據(jù):
創(chuàng)建鏈表節(jié)點(diǎn) >> 導(dǎo)入數(shù)據(jù) >> 頭部指針指向頭節(jié)點(diǎn) >> 尾部指針指向尾節(jié)點(diǎn)
//插入數(shù)據(jù) void Que_push(Quetail* pq,Quetype data) { assert(pq); QueNode* NewNode = (QueNode*)malloc(sizeof(QueNode));//創(chuàng)建節(jié)點(diǎn) if (NewNode == NULL) { printf("Que_push->malloc"); exit(-1); } NewNode->Next = NULL; NewNode->data = data; if (pq->head == NULL) //判斷是否創(chuàng)建為頭節(jié)點(diǎn) { pq->head = NewNode; //更新頭指針 } else { pq->tail->Next = NewNode; //不為頭節(jié)點(diǎn),就正常鏈接在尾節(jié)點(diǎn)后 } pq->tail = NewNode; //更新尾指針 }
3.刪除數(shù)據(jù):
記錄頭節(jié)點(diǎn)的下一個(gè)位置 >> 判斷是否為最后的數(shù)據(jù) >> 更新頭指針
細(xì)節(jié)點(diǎn):如果隊(duì)列中還剩多個(gè)節(jié)點(diǎn)時(shí),刪除頭節(jié)點(diǎn)后,尾指針始終指向尾節(jié)點(diǎn),不需要改動(dòng);
但是如果只剩一個(gè)數(shù)據(jù)節(jié)點(diǎn)的話,刪除后需要將尾指針置空。
//刪除數(shù)據(jù) void Que_pop(Quetail* pq) { assert(pq); assert(!Que_Empty(pq)); //判斷隊(duì)列是否為空 QueNode* Next = pq->head->Next; //記錄刪除數(shù)據(jù)的 if (pq->head == pq->tail) //判斷是否是最后的數(shù)據(jù) { free(pq->head); pq->tail = NULL; //更新尾指針 } else { free(pq->head); } pq->head = Next; //更新頭指針 }
4.判斷列表是否為空:
用bool 作為返回類型
//判斷隊(duì)列是否為空 bool Que_Empty(Quetail* pq) { assert(pq); return pq->head == NULL; }
5.查找隊(duì)列的頭部數(shù)據(jù):
判斷隊(duì)列是否為空 >> 返回頭部數(shù)據(jù)
//查找隊(duì)列的頭部數(shù)據(jù) Quetype Que_front(Quetail* pq) { assert(pq); assert(!Que_Empty(pq)); //判斷隊(duì)列是否為空 return pq->head->data; //返回頭部數(shù)據(jù) }
6. 統(tǒng)計(jì)隊(duì)列的長(zhǎng)度:
就是統(tǒng)計(jì)有多少個(gè)鏈表節(jié)點(diǎn)
int Que_size(Quetail* pq) { assert(pq); int size; QueNode* pphead = pq->head; for (size = 0; pphead; pphead = pphead->Next, size++); return size; }
7.隊(duì)列的銷毀:
依次刪除數(shù)據(jù) >> 將申請(qǐng)空間釋放
細(xì)節(jié)點(diǎn):這里可以進(jìn)行復(fù)用:判斷隊(duì)列是否為空 、 刪除數(shù)據(jù)
void Que_Destory(Quetail* pq) { for (; !Que_Empty(pq); ) //判斷隊(duì)列是否為空 { Que_pop(pq); //刪除數(shù)據(jù) } }
以上就是C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之隊(duì)列的定義與實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言 隊(duì)列的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)電話訂餐管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電話訂餐管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01一篇文章帶你了解C++ static的作用,全局變量和局部變量的區(qū)別
這篇文章介紹了C++ static的作用,全局變量和局部變量的區(qū)別,需要的朋友可以過(guò)來(lái)參考下,希望能夠給你帶來(lái)幫助2021-09-09基于c++強(qiáng)制類型轉(zhuǎn)換的(總結(jié))詳解
本篇文章對(duì)C++中的強(qiáng)制類型轉(zhuǎn)換進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下2013-05-05C語(yǔ)言strlen函數(shù)實(shí)現(xiàn)讀取字符串長(zhǎng)度詳解
這篇文章主要介紹了用C語(yǔ)言的strlen函數(shù)來(lái)實(shí)現(xiàn)讀取字符串長(zhǎng)度的過(guò)程,strlen所作的是一個(gè)計(jì)數(shù)器的工作,它從內(nèi)存的某個(gè)位置開始掃描,直到碰到第一個(gè)字符串結(jié)束符'\0'為止2022-04-04C語(yǔ)言實(shí)現(xiàn)航班訂票系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)航班訂票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12QT布局管理詳解QVBoxLayout與QHBoxLayout及QGridLayout的使用
在這篇文章中,你將知道水平布局、垂直布局、網(wǎng)格布局如何輕松上手,以純代碼方式展示。對(duì)齊方式,大小設(shè)置,圖片頭像匹配標(biāo)簽,布局器里面的組件大小隨意切換大小,認(rèn)真看完這篇文章,QT布局管理器熟練使用2022-06-06C/C++中一次性執(zhí)行多個(gè)DOS命令的實(shí)現(xiàn)思路
在C語(yǔ)言中執(zhí)行DOS命令的方法很多,在這就不一給大家一一介紹了,本文重點(diǎn)給大家介紹C/C++中一次性執(zhí)行多個(gè)DOS命令的實(shí)現(xiàn)思路,需要的朋友參考下2017-12-12C語(yǔ)言代碼實(shí)現(xiàn)猜數(shù)字
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言代碼實(shí)現(xiàn)猜數(shù)字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11VS Code如何編寫C/C++程序的實(shí)現(xiàn)步驟
本文主要介紹了VS Code如何編寫C/C++程序的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09