最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中隊(duì)列的結(jié)構(gòu)和函數(shù)接口的使用示例

 更新時(shí)間:2023年02月14日 14:32:11   作者:[Pokemon]大貓貓  
隊(duì)列只允許一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊(duì)列具有先進(jìn)先出FIFO的性質(zhì);隊(duì)列可用數(shù)組和鏈表 的方法實(shí)現(xiàn),使用鏈表的結(jié)構(gòu)實(shí)現(xiàn)更優(yōu)一些,因?yàn)槿绻褂脭?shù)組節(jié),出隊(duì)列時(shí)刪去首元素需要將整個(gè)數(shù)組前移,效率比較低

一、隊(duì)列的結(jié)構(gòu)

隊(duì)列:一種操作受限的線性表,只允許在線性表的一端進(jìn)行插入,另一端進(jìn)行刪除,插入的一端稱為隊(duì)尾,刪除的一端稱為隊(duì)頭

通過 動(dòng)態(tài)順序表 的實(shí)現(xiàn),可以發(fā)現(xiàn)在數(shù)組的頭部進(jìn)行插入刪除操作時(shí),需要移動(dòng)數(shù)據(jù),效率較低,因此不采用數(shù)組來實(shí)現(xiàn)隊(duì)列

但通過 單鏈表 的實(shí)現(xiàn),可以發(fā)現(xiàn)在對(duì)單鏈表進(jìn)行頭插時(shí)效率很高,而進(jìn)行尾插時(shí),需要找尾數(shù)據(jù),較為麻煩,但是可以通過增加一個(gè)尾指針的方式來提升效率,因此用單鏈表的頭尾指針來實(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;
	//沒有結(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);
	//沒有元素時(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. 訪問隊(duì)頭和隊(duì)尾元素

訪問隊(duì)頭元素函數(shù)如下:

QueueDataType QueueFront(Queue* pq)
{
	assert(pq);
	//沒有元素時(shí),不能取隊(duì)頭元素,這里直接調(diào)用判空函數(shù)
	assert(!QueueEmpty(pq));
	return pq->head->data;
}

訪問隊(duì)尾元素函數(shù)如下:

QueueDataType QueueBack(Queue* pq)
{
	assert(pq);
	//沒有元素時(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語言中隊(duì)列的結(jié)構(gòu)和函數(shù)接口的使用示例的文章就介紹到這了,更多相關(guān)C語言隊(duì)列結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Windows API實(shí)現(xià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)離散系統(tǒng)分岔圖的繪制

    這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)離散分岔圖的繪制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下
    2022-04-04
  • C語言中.c和.h文件區(qū)別講解

    C語言中.c和.h文件區(qū)別講解

    這篇文章主要介紹了C語言中.c和.h文件區(qū)別講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是本文的詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++使用遞歸函數(shù)和棧操作逆序一個(gè)棧的算法示例

    C++使用遞歸函數(shù)和棧操作逆序一個(gè)棧的算法示例

    這篇文章主要介紹了C++使用遞歸函數(shù)和棧操作逆序一個(gè)棧的算法,結(jié)合實(shí)例形式分析了C++遞歸函數(shù)與逆序棧的相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • C++ set到底是什么

    C++ set到底是什么

    這篇文章主要討論C++ 中得set到底是什么?在C++當(dāng)中,這幾個(gè)東西的名字叫做vector、set和map,它們有一個(gè)共同的名字叫做STL(標(biāo)準(zhǔn)模板庫)容器。下面來看看文章是怎么介紹得吧,需要的朋友可以參考一下哦
    2021-11-11
  • C++中的對(duì)象指針總結(jié)

    C++中的對(duì)象指針總結(jié)

    以下是對(duì)C++中的對(duì)象指針進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-10-10
  • C++實(shí)現(xiàn)趣味掃雷游戲

    C++實(shí)現(xiàn)趣味掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)趣味掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++ 中的INT_MAX,INT_MIN數(shù)值大小操作

    C++ 中的INT_MAX,INT_MIN數(shù)值大小操作

    這篇文章主要介紹了C++ 中的INT_MAX,INT_MIN數(shù)值大小操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • C++ 隨機(jī)數(shù)與隨機(jī)種子數(shù)的實(shí)例

    C++ 隨機(jī)數(shù)與隨機(jī)種子數(shù)的實(shí)例

    這篇文章主要介紹了C++ 隨機(jī)數(shù)與隨機(jī)種子數(shù)的實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • c++只保留float型的小數(shù)點(diǎn)后兩位問題

    c++只保留float型的小數(shù)點(diǎn)后兩位問題

    這篇文章主要介紹了c++只保留float型的小數(shù)點(diǎn)后兩位問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評(píng)論

青龙| 平凉市| 岗巴县| 兰州市| 宜宾市| 恩平市| 宁乡县| 昭平县| 会东县| 同仁县| 华池县| 北海市| 嘉鱼县| 怀来县| 澳门| 汶上县| 高邮市| 葫芦岛市| 交口县| 无锡市| 新竹县| 临沧市| 鹿泉市| 昌乐县| 汉寿县| 正定县| 安溪县| 韶山市| 阳东县| 西城区| 化州市| 连州市| 贵溪市| 吉安县| 资中县| 南雄市| 恭城| 迁安市| 社会| 乾安县| 嫩江县|