2.隊(duì)列的結(jié)構(gòu)隊(duì)列:只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊(duì)列具有先進(jìn)先出FIFO(First In First Out) 的特點(diǎn),入隊(duì)列:進(jìn)行插入操作的一端稱為隊(duì)尾,出隊(duì)列:進(jìn)行刪除操作的一端稱為隊(duì)頭
隊(duì)列也可以數(shù)組和鏈表的結(jié)構(gòu)實(shí)現(xiàn),由于隊(duì)列先進(jìn)先出的特點(diǎn),使用鏈表的結(jié)構(gòu)實(shí)現(xiàn)更優(yōu)一些,因?yàn)槿绻褂脭?shù)組的結(jié)構(gòu),出隊(duì)列在數(shù)組頭上出數(shù)據(jù),需要挪動后面的數(shù)據(jù),效率會比較低,而鏈表頭部的插入刪除是很快的
//數(shù)據(jù)類型
typedef int QDataType;
//隊(duì)列結(jié)點(diǎn)數(shù)據(jù)
typedef struct QueueNode
{QDataType data;//數(shù)據(jù)(數(shù)值域)
struct QueueNode* next;//指向下一個(gè)結(jié)點(diǎn)的指針(指針域)
}QNode;
//整個(gè)隊(duì)列數(shù)據(jù)
typedef struct Queue
{QNode* head;//指向?qū)︻^
QNode* tail;//指向?qū)ξ? int size;//數(shù)據(jù)個(gè)數(shù)(隊(duì)列長度)
}Queue;
這里是使用結(jié)構(gòu)體嵌套,方便我們出隊(duì)入隊(duì)時(shí)修改隊(duì)頭和隊(duì)尾結(jié)點(diǎn),我們直接上圖理解:
鏈?zhǔn)疥?duì)列結(jié)構(gòu)圖示:
將頭尾指針置空,避免成為野指針,再將數(shù)據(jù)個(gè)數(shù)置零,方便后面統(tǒng)計(jì)時(shí)累加,這里斷言pq是為了避免人為不小心傳了空指針進(jìn)來
//初始化隊(duì)列
void QueueInit(Queue* pq)
{assert(pq);
pq->head = NULL;
pq->tail = NULL;
pq->size = 0;
}
3.2判斷隊(duì)列是否為空當(dāng)隊(duì)頭指針和隊(duì)尾指針都指向NULL時(shí),說明隊(duì)列就是空隊(duì),當(dāng)然也可以使用隊(duì)長size為0來判斷
//判斷隊(duì)列是否為空
bool QueueEmpty(Queue* pq)
{assert(pq);
//頭尾指針都指向NULL時(shí)為空隊(duì)
return pq->head == NULL && pq->tail == NULL;
}
3.3入隊(duì)入隊(duì)操作就是單鏈表的尾插,首先創(chuàng)建一個(gè)新結(jié)點(diǎn)存入目標(biāo)值,如果是空隊(duì)的情況就直接將新節(jié)點(diǎn)賦值給頭尾結(jié)點(diǎn)指針,通常情況先將尾結(jié)點(diǎn)指向新節(jié)點(diǎn),再將隊(duì)尾指針指向新節(jié)點(diǎn)即可,同時(shí)隊(duì)列長度+1,這里因?yàn)樾枰薷年?duì)頭或隊(duì)尾,所以傳Queue結(jié)構(gòu)體指針
//入隊(duì)
void QueuePush(Queue* pq, QDataType x)
{assert(pq);
//創(chuàng)建新節(jié)點(diǎn)
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL)//判斷申請空間成功
{perror("malloc fail");
exit(-1);
}
newnode->data = x;
newnode->next = NULL;
//隊(duì)為空的情況
if (pq->tail == NULL)
{pq->head = pq->tail = newnode;
}
//通常情況(尾插)
else
{pq->tail->next = newnode;
pq->tail = newnode;
}
//隊(duì)列長度+1
pq->size++;
}
3.4出隊(duì)出隊(duì)操作就是單鏈表的頭刪,這里首先要斷言隊(duì)列為空的情況,隊(duì)空不能出隊(duì),再就是最后一個(gè)元素出隊(duì)時(shí)我們直接釋放掉隊(duì)頭指針并將隊(duì)頭指針和隊(duì)尾指針都置空(避免野指針),通常情況先記錄隊(duì)頭指針,再將隊(duì)頭指針指向其下一個(gè)成為新的隊(duì)頭指針,最后釋放掉記錄的原隊(duì)頭指針即可,同時(shí)隊(duì)長-1
//出隊(duì)
void QueuePop(Queue* pq)
{assert(pq);
//斷言隊(duì)列為空
assert(!QueueEmpty(pq));
//最后一個(gè)元素出隊(duì)
if (pq->head->next == NULL)
{free(pq->head);
pq->head = pq->tail = NULL;
}
//通常情況(頭刪)
else
{QNode* del = pq->head;
pq->head = pq->head->next;
free(del);
//del = NULL; 局部變量沒必要置空
}
//隊(duì)長-1
pq->size--;
}
3.5查看隊(duì)頭元素首先需要斷言隊(duì)列為空的情況,為空無隊(duì)頭元素,然后直接返回隊(duì)頭結(jié)點(diǎn)指向的數(shù)值域即可
//查看隊(duì)頭元素
QDataType QueueFront(Queue* pq)
{assert(pq);
assert(!QueueEmpty(pq));
//返回隊(duì)頭結(jié)點(diǎn)指向的數(shù)值域
return pq->head->data;
}
3.6查看隊(duì)尾元素首先也需要斷言隊(duì)列為空的情況,為空無隊(duì)尾元素,然后直接返回隊(duì)尾結(jié)點(diǎn)指向的數(shù)值域即可
//查看隊(duì)尾元素
QDataType QueueBack(Queue* pq)
{assert(pq);
assert(!QueueEmpty(pq));
//返回隊(duì)尾結(jié)點(diǎn)指向的數(shù)值域
return pq->tail->data;
}
3.7統(tǒng)計(jì)隊(duì)列數(shù)據(jù)個(gè)數(shù)這里size就是隊(duì)列內(nèi)的有效數(shù)據(jù)個(gè)數(shù),我們直接將其返回即可
//統(tǒng)計(jì)隊(duì)列數(shù)據(jù)個(gè)數(shù)
int QueueSize(Queue* pq)
{assert(pq);
//返回size即可
return pq->size;
}
3.8銷毀隊(duì)列隊(duì)列的銷毀類似單鏈表,從隊(duì)頭結(jié)點(diǎn)開始循環(huán)依次銷毀所有節(jié)點(diǎn)即可,這里我們也是先記錄遍歷指針的位置,然后將遍歷指針移動到下一個(gè)結(jié)點(diǎn),最后釋放掉先前記錄的節(jié)點(diǎn),最后將隊(duì)頭指針和隊(duì)尾指針都置空(防止野指針),再將size置零就完成了
//銷毀隊(duì)列
void QueueDestroy(Queue* pq)
{assert(pq);
//從隊(duì)頭開始遍歷銷毀
QNode* cur = pq->head;
while (cur)
{QNode* del = cur;
cur = cur->next;
free(del);
}
pq->head = pq->tail = NULL;//置空
pq->size = 0;//置零
}
隊(duì)列的實(shí)現(xiàn)到這里就介紹結(jié)束了,期待大佬們的三連!你們的支持是我大的動力!
文章有寫的不足或是錯(cuò)誤的地方,歡迎評論或私信指出,我會在第一時(shí)間改正。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
分享題目:隊(duì)列(C語言實(shí)現(xiàn))-創(chuàng)新互聯(lián)
URL分享:http://www.rwnh.cn/article6/ijpig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、網(wǎng)站收錄、標(biāo)簽優(yōu)化、用戶體驗(yàn)、網(wǎng)站維護(hù)、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容