隊(duì)列(C語(yǔ)言實(shí)現(xiàn))-創(chuàng)新互聯(lián)

文章目錄:
  • 1.隊(duì)列的概念
  • 2.隊(duì)列的結(jié)構(gòu)
  • 3.接口實(shí)現(xiàn)
    • 3.1初始化隊(duì)列
    • 3.2判斷隊(duì)列是否為空
    • 3.3入隊(duì)
    • 3.4出隊(duì)
    • 3.5查看隊(duì)頭元素
    • 3.6查看隊(duì)尾元素
    • 3.7統(tǒng)計(jì)隊(duì)列數(shù)據(jù)個(gè)數(shù)
    • 3.8銷毀隊(duì)列

公司專注于為企業(yè)提供成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、商城建設(shè)小程序開(kāi)發(fā),軟件定制開(kāi)發(fā)等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。憑借多年豐富的經(jīng)驗(yàn),我們會(huì)仔細(xì)了解各客戶的需求而做出多方面的分析、設(shè)計(jì)、整合,為客戶設(shè)計(jì)出具風(fēng)格及創(chuàng)意性的商業(yè)解決方案,創(chuàng)新互聯(lián)公司更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務(wù)。1.隊(duì)列的概念

隊(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ì)頭

2.隊(duì)列的結(jié)構(gòu)

隊(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ù),需要挪動(dòng)后面的數(shù)據(jù),效率會(huì)比較低,而鏈表頭部的插入刪除是很快的

//數(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ì)列長(zhǎng)度)
}Queue;

這里是使用結(jié)構(gòu)體嵌套,方便我們出隊(duì)入隊(duì)時(shí)修改隊(duì)頭和隊(duì)尾結(jié)點(diǎn),我們直接上圖理解:
鏈?zhǔn)疥?duì)列結(jié)構(gòu)圖示:

3.接口實(shí)現(xiàn) 3.1初始化隊(duì)列

將頭尾指針置空,避免成為野指針,再將數(shù)據(jù)個(gè)數(shù)置零,方便后面統(tǒng)計(jì)時(shí)累加,這里斷言pq是為了避免人為不小心傳了空指針進(jìn)來(lái)

//初始化隊(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í),說(shuō)明隊(duì)列就是空隊(duì),當(dāng)然也可以使用隊(duì)長(zhǎng)size為0來(lái)判斷

//判斷隊(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ì)列長(zhǎng)度+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)//判斷申請(qǐng)空間成功
	{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ì)列長(zhǎng)度+1
	pq->size++;
}
3.4出隊(duì)

出隊(duì)操作就是單鏈表的頭刪,這里首先要斷言隊(duì)列為空的情況,隊(duì)空不能出隊(duì),再就是最后一個(gè)元素出隊(duì)時(shí)我們直接釋放掉隊(duì)頭指針并將隊(duì)頭指針和隊(duì)尾指針都置空(避免野指針),通常情況先記錄隊(duì)頭指針,再將隊(duì)頭指針指向其下一個(gè)成為新的隊(duì)頭指針,最后釋放掉記錄的原隊(duì)頭指針即可,同時(shí)隊(duì)長(zhǎng)-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; 局部變量沒(méi)必要置空
	}
	//隊(duì)長(zhǎng)-1
	pq->size--;
}
3.5查看隊(duì)頭元素

首先需要斷言隊(duì)列為空的情況,為空無(wú)隊(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ì)列為空的情況,為空無(wú)隊(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)開(kāi)始循環(huán)依次銷毀所有節(jié)點(diǎn)即可,這里我們也是先記錄遍歷指針的位置,然后將遍歷指針移動(dòng)到下一個(gè)結(jié)點(diǎn),最后釋放掉先前記錄的節(jié)點(diǎn),最后將隊(duì)頭指針和隊(duì)尾指針都置空(防止野指針),再將size置零就完成了

//銷毀隊(duì)列
void QueueDestroy(Queue* pq)
{assert(pq);
	//從隊(duì)頭開(kāi)始遍歷銷毀
	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é)束了,期待大佬們的三連!你們的支持是我大的動(dòng)力!
文章有寫(xiě)的不足或是錯(cuò)誤的地方,歡迎評(píng)論或私信指出,我會(huì)在第一時(shí)間改正。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

分享題目:隊(duì)列(C語(yǔ)言實(shí)現(xiàn))-創(chuàng)新互聯(lián)
URL分享:http://muchs.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)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名