數據結構與算法學習筆記十---鏈隊列的表示和實現(C語言)

目錄

前言

1.什么是鏈隊

2.鏈隊的表示和實現

1.定義

2.初始化

3.銷毀

4.清空

5.空隊列

6.隊列長度

7.獲取隊頭

8.入隊

9.出隊

10.遍歷隊列

11.完整代碼


前言

? ? 本篇博客介紹鏈棧隊列的表示和實現。

1.什么是鏈隊

? ? 鏈隊是采用鏈式存儲結構實現的隊列。通常鏈隊使用單鏈表表示。

? ?

圖1.鏈隊的示意圖

? ? ?為了操作方便,我們給鏈隊列增加一個頭結點,令頭指針始終指向頭結點。

2.鏈隊的表示和實現

1.定義

typedef int QElemType;
typedef int Status;
typedef struct QNode{QElemType data;struct QNode * next;
}QNode,*QueuePtr;
typedef struct {QueuePtr front;//隊頭指針QueuePtr rear;//隊尾指針
}LinkQueue;

2.初始化

? ? ? ? ? ? 初始化的時候給鏈隊分配一個結點。

? ? ? ? 圖2.空隊列

//初始化
Status initLinkQueue(LinkQueue * linkQueue){linkQueue->front =  linkQueue->rear = (QueuePtr)malloc(sizeof(QNode));if (!linkQueue->front) {return 0;}return 1;
}

3.銷毀

????????當需要銷毀隊列時,我們需要釋放隊列中所有節點的內存,并將隊列結構體中的指針置空。

? ? ? ? ?我們需要遍歷所有的結點,釋放結點內存,最后置空頭結點。

// 銷毀隊列
void destroyLinkQueue(LinkQueue *linkQueue) {while (linkQueue->front) { // 循環釋放隊列中所有節點的內存QueuePtr temp = linkQueue->front;linkQueue->front = linkQueue->front->next;free(temp);}linkQueue->rear = NULL; // 將 rear 指針置空
}

4.清空

????????清空隊列的方法與銷毀隊列的方法類似,但不釋放隊列結構體本身的內存,只釋放隊列中節點的內存并將隊列恢復到初始狀態。

// 清空隊列
void clearLinkQueue(LinkQueue *linkQueue) {while (linkQueue->front) { // 循環釋放隊列中所有節點的內存QueuePtr temp = linkQueue->front;linkQueue->front = linkQueue->front->next;free(temp);}linkQueue->rear = NULL; // 將 rear 指針置空
}

5.空隊列

? ? ? ? 隊頭和隊尾相同的時候為空隊列。

// 判斷隊列是否為空
Status isLinkQueueEmpty(LinkQueue *linkQueue) {return linkQueue->front == NULL; // 如果隊頭指針為空,則隊列為空
}

6.隊列長度

// 計算隊列長度
int getLinkQueueLength(LinkQueue *linkQueue) {int length = 0;QueuePtr p = linkQueue->front->next; // 從隊頭指針開始while (p != NULL) { // 遍歷隊列length++;p = p->next;}return length;
}

7.獲取隊頭

? ? ? ? 獲取隊頭元素。

// 獲取隊列頭結點
Status getLinkQueueFront(LinkQueue *linkQueue, QElemType *element) {if (linkQueue->front == NULL) { // 隊列為空return 0;}*element = linkQueue->front->next->data; // 將隊頭節點的數據存儲到 element 中return 1;
}

8.入隊

? ? ? ? 入隊列的時候如下所示。

? ? ? ? 圖3.入隊列示意圖

// 入隊列
Status enLinkQueue(LinkQueue * linkQueue,QElemType element){QueuePtr newNode = (QNode *)malloc(sizeof(QNode));//生成一個新節點if (!newNode) {return 0;}newNode->data = element;newNode->next = NULL;linkQueue->rear->next = newNode;linkQueue->rear = newNode;return 1;
}

9.出隊

? ? ? ? 出隊列的時候如下如所示:

圖4.出隊列示意圖

// 出隊列
Status deLinkQueue(LinkQueue * linkQueue,QElemType *element){if (linkQueue->front == linkQueue->rear) {//空隊列return 0;}QueuePtr p = linkQueue->front->next;// 指向頭結點* element = p->data;linkQueue->front->next = p->next;//修改頭指針if (linkQueue->front == p) {//如果僅有一個節點linkQueue->rear = linkQueue->front;//修改尾指針}free(p);return 1;
}

10.遍歷隊列

// 遍歷隊列(忽略頭結點)
void traverseLinkQueueIgnoreHead(LinkQueue *linkQueue) {if (linkQueue->front == NULL || linkQueue->front->next == NULL) { // 隊列為空或只有頭結點printf("隊列為空\n");return;}QueuePtr current = linkQueue->front->next; // 從頭結點的下一個節點開始遍歷while (current != NULL) { // 遍歷直到隊尾printf("%d\t", current->data); // 打印當前節點的數據current = current->next; // 移動到下一個節點}printf("\n");
}

11.完整代碼

#include <stdlib.h>typedef int QElemType;
typedef int Status;
typedef struct QNode{QElemType data;struct QNode * next;
}QNode,*QueuePtr;
typedef struct {QueuePtr front;//隊頭指針QueuePtr rear;//隊尾指針
}LinkQueue;//初始化
Status initLinkQueue(LinkQueue * linkQueue){linkQueue->front =  linkQueue->rear = (QueuePtr)malloc(sizeof(QNode));if (!linkQueue->front) {return 0;}return 1;
}
// 銷毀隊列
void destroyLinkQueue(LinkQueue *linkQueue) {while (linkQueue->front) { // 循環釋放隊列中所有節點的內存QueuePtr temp = linkQueue->front;linkQueue->front = linkQueue->front->next;free(temp);}linkQueue->rear = NULL; // 將 rear 指針置空
}
// 清空隊列
void clearLinkQueue(LinkQueue *linkQueue) {while (linkQueue->front) { // 循環釋放隊列中所有節點的內存QueuePtr temp = linkQueue->front;linkQueue->front = linkQueue->front->next;free(temp);}linkQueue->rear = NULL; // 將 rear 指針置空
}
// 判斷隊列是否為空
Status isLinkQueueEmpty(LinkQueue *linkQueue) {return linkQueue->front == NULL; // 如果隊頭指針為空,則隊列為空
}
// 計算隊列長度
int getLinkQueueLength(LinkQueue *linkQueue) {int length = 0;QueuePtr p = linkQueue->front->next; // 從隊頭指針開始while (p != NULL) { // 遍歷隊列length++;p = p->next;}return length;
}
// 獲取隊列頭結點
Status getLinkQueueFront(LinkQueue *linkQueue, QElemType *element) {if (linkQueue->front == NULL) { // 隊列為空return 0;}*element = linkQueue->front->next->data; // 將隊頭節點的數據存儲到 element 中return 1;
}
// 遍歷隊列
// 遍歷隊列(忽略頭結點)
void traverseLinkQueueIgnoreHead(LinkQueue *linkQueue) {if (linkQueue->front == NULL || linkQueue->front->next == NULL) { // 隊列為空或只有頭結點printf("隊列為空\n");return;}QueuePtr current = linkQueue->front->next; // 從頭結點的下一個節點開始遍歷while (current != NULL) { // 遍歷直到隊尾printf("%d\t", current->data); // 打印當前節點的數據current = current->next; // 移動到下一個節點}printf("\n");
}// 入隊列
Status enLinkQueue(LinkQueue * linkQueue,QElemType element){QueuePtr newNode = (QNode *)malloc(sizeof(QNode));//生成一個新節點if (!newNode) {return 0;}newNode->data = element;newNode->next = NULL;linkQueue->rear->next = newNode;linkQueue->rear = newNode;return 1;
}
// 出隊列
Status deLinkQueue(LinkQueue * linkQueue,QElemType *element){if (linkQueue->front == linkQueue->rear) {//空隊列return 0;}QueuePtr p = linkQueue->front->next;// 指向頭結點* element = p->data;linkQueue->front->next = p->next;//修改頭指針if (linkQueue->front == p) {//如果僅有一個節點linkQueue->rear = linkQueue->front;//修改尾指針}free(p);return 1;
}void testLinkQueue(void){LinkQueue queue;if (initLinkQueue(&queue)) {printf("鏈隊列初始化成功!\n");}else {printf("鏈隊列初始化失敗!\n");}if (isLinkQueueEmpty(&queue)) {printf("隊列為空\n");}printf("隊列長度:%d\n",getLinkQueueLength(&queue));for (int i = 1; i <= 10 ; i++) {if (enLinkQueue(&queue, i)) {printf("數據元素%d入隊成功!\n",i);}else{printf("入隊失敗!\n");}}printf("遍歷鏈隊列初!\n");if (!isLinkQueueEmpty(&queue)) {printf("隊列不為空\n");}QElemType headFront;if (getLinkQueueFront(&queue, &headFront)) {printf("隊列頭結點獲取成功,隊頭元素為:%d\n",headFront);}traverseLinkQueueIgnoreHead(&queue);printf("隊列長度:%d\n",getLinkQueueLength(&queue));printf("隊列長度:%d\n",getLinkQueueLength(&queue));for (int i = 1; i <= 10 ; i++) {int element;if (deLinkQueue(&queue, &element)) {printf("出隊列成功,出隊列的數據元為素%d!\n",element);}else{printf("入隊失敗!\n");}}destroyLinkQueue(&queue);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/12356.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12356.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12356.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【知識拓展】大白話說清楚:IP地址、子網掩碼、網關、DNS等

前言 工作中常聽別人說的本地網絡是什么意思&#xff1f;同一網段又是什么意思&#xff1f;它倆有關系嗎&#xff1f; 在工作中內經常會遇到相關的網絡問題&#xff0c;涉及網絡通信中一些常見的詞匯&#xff0c;如IP地址、子網掩碼、網關和DNS等。具體一點&#xff1a;經常會…

申請免費的必應搜索API

申請免費的必應搜索API 文章目錄 申請免費的必應搜索API前言一、原理1.1 登錄1.2 進入1.3 獲取密鑰1.4 申請VISA信用卡1.5 創建必應自定義搜索資源 二、創建成功 前言 準備條件&#xff1a; 1、outlook郵箱 2、招商銀行全幣種VISA信用卡【建議之前就有一張招商銀行信用卡&…

【opencv】圖像拼接實驗

實驗環境&#xff1a;anaconda、jupyter notebook 實驗用到的包&#xff1a;opencv、matplotlib、numpy 注&#xff1a;opencv在3.4.2之后sift就不是免費的了 我用的是3.4.1.15版本 實驗使用到的圖片 一、sift函數獲取特征值 讀入圖片 book cv2.imread(book.png, cv2.IMRE…

【極簡】如何估算大模型inference所需的內存量

1字節8bit 16float2字節 模型后面的xxb的單位是字節。 1b 字節≈ 0.93G&#xff0c;這個是以8bit運行&#xff0c;4bit減半&#xff0c;16bit&#xff08;float&#xff09;加倍&#xff0c;32bit&#xff08;double&#xff09;炒雞加倍。 剩下的是小頭&#xff0c;需要參數計…

蘋果macOS無法給App麥克風授權解決辦法

好久沒有在電腦上錄制課程了&#xff0c;有些東西還是錄下來記憶深刻&#xff0c;卻意外發現MAC系統升級后無法授權給第三方的App使用攝像頭和麥克風&#xff0c;而錄屏軟件是需要開啟麥克風和攝像頭才能錄制屏幕上的操作和聲音&#xff0c;官方提示在第三方APP若有使用攝像頭和…

css的4種導入方式

熟悉CSS樣式4種的引用方式&#xff0c;分別為行內式、內嵌式、鏈入式和導入式。 行內式 <標簽名 style"屬性1:屬性值1;屬性2:屬性值2;屬性3:屬性值3;">內容</ 標簽名>style是標簽的屬性&#xff0c;實際上任何HTML標簽都擁有style屬性&#xff0c;用來…

pyqt QComboBox下拉列表框控件

pyqt QComboBox下拉列表框控件 QComboBox效果代碼 QComboBox QComboBox 是 PyQt&#xff08;中的一個控件&#xff0c;它允許用戶從下拉列表中選擇一個選項。這個控件在需要用戶從預定義選項中進行選擇時非常有用。 效果 代碼 import sys from PyQt5.QtWidgets import QAppl…

vite創建的項目使用rem適配

下面以創建vue3.0 項目為例&#xff1a; npm init vitelatest “名稱” 選擇vue &#xff08;選擇你所對應的語言&#xff09; 更具提示步驟執行 cd xxx npm i npm run dev 然后再項目中使用 rem 需要安裝插件 第一步安裝插件 npm i amfe-flexible npm i postcss-pxtorem 第二…

CS144 Checkpoint 4: interoperating in the world(2024)

分析網絡路徑和性能&#xff1a; mtr命令 mtr 輸出的詳細分析&#xff1a; mtr 162.105.253.58 命令用于結合 traceroute 和 ping 的功能&#xff0c;實時監測并分析從你的計算機到目標主機&#xff08;IP 地址 162.105.253.58&#xff0c;北京大學計算中心&#xff09;之間…

Nginx配置Referer防盜鏈

系列文章目錄 文章目錄 系列文章目錄前言 前言 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站&#xff0c;這篇文章男女通用&#xff0c;看懂了就去分享給你的碼吧。 HTTP Referer是Hea…

PBOOTCMS|URL靜態制作教程(已解答)

0、先解壓源碼文件&#xff0c;在覆蓋靜態文件&#xff0c;全部點是。 打開程序后臺登錄地址www.xxx.com(你的域名)/admin.php/Menu/index 打開程序后臺--系統菜單--菜單新增&#xff08;清理緩存后重新登錄賬號&#xff09; &#xff08;選擇父菜單&#xff0c;菜單名稱&#…

ROS2+TurtleBot3+Cartographer+Nav2實現slam建圖和導航

0 引言 入門機器人最常見的應用就是slam建圖和導航&#xff0c;本文將詳細介紹這一流程&#xff0c; 便于初學這快速上手。 首先對需要用到的軟件包就行簡單介紹。 turtlebot3: 是一個小型的&#xff0c;基于ros的移動機器人。 學習機器人的很多示例程序都是基于turtlebot3。 …

【Java基礎】枚舉類的方法及應用

如何實現讓一個類有固定個數的對象 手動封裝構造方法&#xff08;private&#xff09; → 創建靜態對象 → final修飾靜態對象&#xff0c;使其成為常量 class Season { //枚舉類public final static Season SPRING new Season();public final static Season SUMMER new Se…

MySQL數據庫備份全攻略:從基礎到高級,一文掌握所有備份技巧

在數據為王的時代&#xff0c;數據庫的備份無疑是每一位數據庫管理員&#xff08;DBA&#xff09;和開發者必須掌握的核心技能。MySQL作為世界上最流行的開源關系型數據庫管理系統&#xff0c;其備份策略的多樣性和靈活性更是值得我們深入探討。今天&#xff0c;我們將從基礎的…

廢品回收微信小程序基于FastAdmin+ThinkPHP+UniApp(源碼搭建/上線/運營/售后/更新)

一款基于FastAdminThinkPHPUniApp開發的廢品回收系統&#xff0c;適用廢品回收站、再生資源回收公司上門回收使用的小程序。 一、FastAdmin框架特色功能及優勢 模塊化開發&#xff1a;控制器、模型、視圖、JS一一對應&#xff0c;使用RequireJS進行插件機制&#xff0c;支持插…

Java面試題:線程池的核心參數和工作原理

線程池的核心參數 ThreadPoolExecutor(int corePoolSize,//核心線程數目int MaximumPoolSize,//最大線程數核心線程臨時線程long keepAliveTime,//臨時線程的存活時間,在存活時間內如果沒有新任務,線程資源會被釋放TimeUnit unit,//存活時間的時間單位,一個枚舉類型BlockingQu…

sql操作、發送http請求和郵件發送 全棧開發之路——后端篇(2)

全棧開發一條龍——前端篇 第一篇&#xff1a;框架確定、ide設置與項目創建 第二篇&#xff1a;介紹項目文件意義、組件結構與導入以及setup的引入。 第三篇&#xff1a;setup語法&#xff0c;設置響應式數據。 第四篇&#xff1a;數據綁定、計算屬性和watch監視 第五篇 : 組件…

STL介紹及使用場景分析

一.總體介紹 STL&#xff08;Standard Template Library&#xff09;是C標準模板庫&#xff0c;提供了一系列的通用模板類和函數&#xff0c;用于實現常見的數據結構和算法&#xff0c;方便開發者快速地實現各種功能。STL包括了容器&#xff08;Containers&#xff09;、算法&a…

[BJDCTF 2020]easy_md5、[HNCTF 2022 Week1]Interesting_include、[GDOUCTF 2023]泄露的偽裝

目錄 [BJDCTF 2020]easy_md5 ffifdyop [SWPUCTF 2021 新生賽]crypto8 [HNCTF 2022 Week1]Interesting_include php://filter協議 [GDOUCTF 2023]泄露的偽裝 [BJDCTF 2020]easy_md5 嘗試輸入一個1&#xff0c;發現輸入的內容會通過get傳遞但是沒有其他回顯 觀察一下響應…

文本協議中嵌入二進制數據

在文本協議中嵌入二進制數據時&#xff0c;通常不推薦使用new String(byte[], Charset)&#xff0c;除非你確定這些字節實際上是以指定的字符集編碼的文本。這是因為如果字節不是有效的文本編碼&#xff0c;那么使用new String(byte[], Charset)可能會產生不可預測的結果&#…