C語言中隊列的結(jié)構(gòu)和函數(shù)接口的使用示例
一、隊列的結(jié)構(gòu)
隊列:一種操作受限的線性表,只允許在線性表的一端進(jìn)行插入,另一端進(jìn)行刪除,插入的一端稱為隊尾,刪除的一端稱為隊頭
通過 動態(tài)順序表 的實(shí)現(xiàn),可以發(fā)現(xiàn)在數(shù)組的頭部進(jìn)行插入刪除操作時,需要移動數(shù)據(jù),效率較低,因此不采用數(shù)組來實(shí)現(xiàn)隊列
但通過 單鏈表 的實(shí)現(xiàn),可以發(fā)現(xiàn)在對單鏈表進(jìn)行頭插時效率很高,而進(jìn)行尾插時,需要找尾數(shù)據(jù),較為麻煩,但是可以通過增加一個尾指針的方式來提升效率,因此用單鏈表的頭尾指針來實(shí)現(xiàn)隊列,結(jié)構(gòu)如下:
//隊列的元素類型 typedef int QueueDataType; //隊列的結(jié)點(diǎn)結(jié)構(gòu) typedef struct QueueNode { QueueDataType data; struct QueueNode* next; }QNode; //隊列結(jié)構(gòu),需要包含指向鏈表的頭指針和尾指針 //為了求隊列數(shù)據(jù)個數(shù)時,時間復(fù)雜度為 O(1),這里增加一個 size 變量 typedef struct Queue { QNode* head; QNode* tail; int size; }Queue;
二、隊列的函數(shù)接口
1. 初始化和銷毀
初始化函數(shù)如下:
void QueueInit(Queue* pq) { assert(pq); pq->head = pq->tail = NULL; pq->size = 0; }
鏈表的結(jié)點(diǎn)都是動態(tài)開辟的,不用隊列時,應(yīng)當(dāng)銷毀
銷毀函數(shù)如下:
void QueueDestroy(Queue* pq) { assert(pq); //從頭結(jié)點(diǎn)開始銷毀 QNode* cur = pq->head; while (cur) { //保存下一個結(jié)點(diǎn) QNode* next = cur->next; free(cur); cur = next; } pq->head = pq->tail = NULL; pq->size = 0; }
2. 入隊和出隊
入隊:在隊尾插入元素
入隊函數(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; //沒有結(jié)點(diǎn)時,插入元素,需要改變隊列的頭尾指針 //有結(jié)點(diǎn)時,直接鏈接在尾結(jié)點(diǎn)之后,tail 變成新的尾 if (pq->tail == NULL) { pq->head = pq->tail = newnode; } else { pq->tail->next = newnode; pq->tail = newnode; } //插入元素后,數(shù)據(jù)個數(shù)需要自增 pq->size++; }
出隊:刪除隊頭元素
出隊函數(shù)如下:
void QueuePop(Queue* pq) { assert(pq); //沒有元素時,不能刪除,這里直接調(diào)用判空函數(shù) assert(!QueueEmpty(pq)); //如果只有一個結(jié)點(diǎn)時,需要改變隊列的頭尾指針 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ù)個數(shù)需要自減 pq->size--; }
3. 訪問隊頭和隊尾元素
訪問隊頭元素函數(shù)如下:
QueueDataType QueueFront(Queue* pq) { assert(pq); //沒有元素時,不能取隊頭元素,這里直接調(diào)用判空函數(shù) assert(!QueueEmpty(pq)); return pq->head->data; }
訪問隊尾元素函數(shù)如下:
QueueDataType QueueBack(Queue* pq) { assert(pq); //沒有元素時,不能取隊尾元素,這里直接調(diào)用判空函數(shù) assert(!QueueEmpty(pq)); return pq->tail->data; }
4. 判空和元素個數(shù)
判空函數(shù)如下:
bool QueueEmpty(Queue* pq) { assert(pq); return pq->size == 0; }
元素個數(shù)函數(shù)如下:
size_t QueueSize(Queue* pq) { assert(pq); return pq->size; }
到此這篇關(guān)于C語言中隊列的結(jié)構(gòu)和函數(shù)接口的使用示例的文章就介紹到這了,更多相關(guān)C語言隊列結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中malloc與free、new與delete的詳解與應(yīng)用
今天小編就為大家分享一篇關(guān)于C++中malloc與free、new與delete的詳解與應(yīng)用,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12C++ 數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)兩個棧實(shí)現(xiàn)一個隊列
這篇文章主要介紹了詳解C++ 數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)兩個棧實(shí)現(xiàn)一個隊列的相關(guān)資料,需要的朋友可以參考下2017-03-03