C語(yǔ)言中隊(duì)列的結(jié)構(gòu)和函數(shù)接口的使用示例
一、隊(duì)列的結(jié)構(gòu)
隊(duì)列:一種操作受限的線性表,只允許在線性表的一端進(jìn)行插入,另一端進(jìn)行刪除,插入的一端稱為隊(duì)尾,刪除的一端稱為隊(duì)頭

通過(guò) 動(dòng)態(tài)順序表 的實(shí)現(xiàn),可以發(fā)現(xiàn)在數(shù)組的頭部進(jìn)行插入刪除操作時(shí),需要移動(dòng)數(shù)據(jù),效率較低,因此不采用數(shù)組來(lái)實(shí)現(xiàn)隊(duì)列
但通過(guò) 單鏈表 的實(shí)現(xiàn),可以發(fā)現(xiàn)在對(duì)單鏈表進(jìn)行頭插時(shí)效率很高,而進(jìn)行尾插時(shí),需要找尾數(shù)據(jù),較為麻煩,但是可以通過(guò)增加一個(gè)尾指針的方式來(lái)提升效率,因此用單鏈表的頭尾指針來(lái)實(shí)現(xiàn)隊(duì)列,結(jié)構(gòu)如下:

//隊(duì)列的元素類型
typedef int QueueDataType;
//隊(duì)列的結(jié)點(diǎn)結(jié)構(gòu)
typedef struct QueueNode
{
QueueDataType data;
struct QueueNode* next;
}QNode;
//隊(duì)列結(jié)構(gòu),需要包含指向鏈表的頭指針和尾指針
//為了求隊(duì)列數(shù)據(jù)個(gè)數(shù)時(shí),時(shí)間復(fù)雜度為 O(1),這里增加一個(gè) size 變量
typedef struct Queue
{
QNode* head;
QNode* tail;
int size;
}Queue;
二、隊(duì)列的函數(shù)接口
1. 初始化和銷毀
初始化函數(shù)如下:
void QueueInit(Queue* pq)
{
assert(pq);
pq->head = pq->tail = NULL;
pq->size = 0;
}
鏈表的結(jié)點(diǎn)都是動(dòng)態(tài)開辟的,不用隊(duì)列時(shí),應(yīng)當(dāng)銷毀
銷毀函數(shù)如下:
void QueueDestroy(Queue* pq)
{
assert(pq);
//從頭結(jié)點(diǎn)開始銷毀
QNode* cur = pq->head;
while (cur)
{
//保存下一個(gè)結(jié)點(diǎn)
QNode* next = cur->next;
free(cur);
cur = next;
}
pq->head = pq->tail = NULL;
pq->size = 0;
}
2. 入隊(duì)和出隊(duì)
入隊(duì):在隊(duì)尾插入元素
入隊(duì)函數(shù)如下:
void QueuePush(Queue* pq, QueueDataType x)
{
assert(pq);
//創(chuàng)建新結(jié)點(diǎn)
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL)
{
perror("malloc");
exit(-1);
}
newnode->data = x;
newnode->next = NULL;
//沒(méi)有結(jié)點(diǎn)時(shí),插入元素,需要改變隊(duì)列的頭尾指針
//有結(jié)點(diǎn)時(shí),直接鏈接在尾結(jié)點(diǎn)之后,tail 變成新的尾
if (pq->tail == NULL)
{
pq->head = pq->tail = newnode;
}
else
{
pq->tail->next = newnode;
pq->tail = newnode;
}
//插入元素后,數(shù)據(jù)個(gè)數(shù)需要自增
pq->size++;
}
出隊(duì):刪除隊(duì)頭元素
出隊(duì)函數(shù)如下:
void QueuePop(Queue* pq)
{
assert(pq);
//沒(méi)有元素時(shí),不能刪除,這里直接調(diào)用判空函數(shù)
assert(!QueueEmpty(pq));
//如果只有一個(gè)結(jié)點(diǎn)時(shí),需要改變隊(duì)列的頭尾指針
if (pq->head->next == NULL)
{
free(pq->head);
pq->head = pq->tail = NULL;
}
else
{
QNode* next = pq->head->next;
free(pq->head);
pq->head = next;
}
//刪除元素后,數(shù)據(jù)個(gè)數(shù)需要自減
pq->size--;
}
3. 訪問(wèn)隊(duì)頭和隊(duì)尾元素
訪問(wèn)隊(duì)頭元素函數(shù)如下:
QueueDataType QueueFront(Queue* pq)
{
assert(pq);
//沒(méi)有元素時(shí),不能取隊(duì)頭元素,這里直接調(diào)用判空函數(shù)
assert(!QueueEmpty(pq));
return pq->head->data;
}
訪問(wèn)隊(duì)尾元素函數(shù)如下:
QueueDataType QueueBack(Queue* pq)
{
assert(pq);
//沒(méi)有元素時(shí),不能取隊(duì)尾元素,這里直接調(diào)用判空函數(shù)
assert(!QueueEmpty(pq));
return pq->tail->data;
}
4. 判空和元素個(gè)數(shù)
判空函數(shù)如下:
bool QueueEmpty(Queue* pq)
{
assert(pq);
return pq->size == 0;
}
元素個(gè)數(shù)函數(shù)如下:
size_t QueueSize(Queue* pq)
{
assert(pq);
return pq->size;
}
到此這篇關(guān)于C語(yǔ)言中隊(duì)列的結(jié)構(gòu)和函數(shù)接口的使用示例的文章就介紹到這了,更多相關(guān)C語(yǔ)言隊(duì)列結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Windows API實(shí)現(xiàn)遍歷所有文件并刪除的方法
這篇文章主要介紹了基于Windows API實(shí)現(xiàn)遍歷所有文件并刪除的方法,是win32應(yīng)用程序的一個(gè)比較典型的文件操作應(yīng)用技巧,需要的朋友可以參考下2015-04-04
基于Matlab實(shí)現(xiàn)離散系統(tǒng)分岔圖的繪制
這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)離散分岔圖的繪制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下2022-04-04
C++使用遞歸函數(shù)和棧操作逆序一個(gè)棧的算法示例
這篇文章主要介紹了C++使用遞歸函數(shù)和棧操作逆序一個(gè)棧的算法,結(jié)合實(shí)例形式分析了C++遞歸函數(shù)與逆序棧的相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
C++ 中的INT_MAX,INT_MIN數(shù)值大小操作
這篇文章主要介紹了C++ 中的INT_MAX,INT_MIN數(shù)值大小操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
C++ 隨機(jī)數(shù)與隨機(jī)種子數(shù)的實(shí)例
這篇文章主要介紹了C++ 隨機(jī)數(shù)與隨機(jī)種子數(shù)的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-07-07
c++只保留float型的小數(shù)點(diǎn)后兩位問(wèn)題
這篇文章主要介紹了c++只保留float型的小數(shù)點(diǎn)后兩位問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

