C語言隊列的實現

目錄

?編輯

(一)隊列的定義,初始化及創建結點

?

?(二)入隊和出隊,以及取隊頭隊尾的數據

(三)銷毀隊列


隊列是指只允許在一端進行插入數據操作,在另?端進行刪除數據操作的特殊線性表,隊列具有先進先出FIFO(First In First Out)的特點。本篇文章的隊列以鏈表為基礎進行創建


(一)隊列的定義,初始化及創建結點

//隊列的初始化
//我們先宏定義隊列存儲的數據類型#define QueueDataType int           //這里我們宏定義隊列存儲的數據類型為int//這里定義隊列的結點
typedef struct QueueNode
{QueueDataType data;struct QueueNode* next;
}QueueNode;//為了方便隊列的出隊和入隊我們要新定義一個結構體,里面裝著頭結點和尾結點的指針。
type struct Queue
{QueueNode* phead;QueueNode* ptail;
}Queue;

?

這里我們定義了隊列的結點和管理整個隊列的結構體。關于鏈表形式的數據結構我們往往要單獨寫封裝一個函數來創建結點。

//封裝一個函數,專門用來創建結點
//該函數的形參是一個數據類型,返回創建的結點的指針
QueueNode* BuyNewNode(QueueDataType val)
{//動態向內存申請空間QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));//防止使用創建結點失敗返回的NULL指針if (newnode == NULL){perror("newnode malloc failed!");exit(1);}//給創建好的結點初始化newnode->data = val;newnode->next = NULL;//返回初始值return newnode;
}

我們還需要初始化管理整個結點的那個結構體,就叫它隊列吧

//初始化隊列
void InitQueue(Queue* pq)
{//檢查是否為空指針assert(pq);pq->phead = NULL;pq->ptail = NULL;
}

?

?

?(二)入隊和出隊,以及取隊頭隊尾的數據

入隊就是從隊伍的后面進去。根據這個原理我們直接寫

//隊列的入隊(要在初始化隊列之后)
//我們通過管理整個隊列的那個結構體來進行操作
//所以這里我們接受那個結構體的形參
void QueuePush(Queue* pq, QueueDataType val)
{//檢查是不是空指針assert(pq);//我們可以通過pq來找到隊伍的尾結點//進行入隊操作。如果隊列為空if (pq->phead == NULL){pq->phead = pq->ptail = BuyNewNode(val);}else                //如果隊列不為空,則尾插到隊尾{pq->ptail->next = BuyNewNode(val);pq->ptail = pq->ptail->next;}
}

在寫出隊之前我們先得寫一個函數來檢查隊列是否為空,防止隊列里沒有數據

//判斷隊列是否為空,我們采用bool值
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}

進行出隊。

//隊列的出隊
void QueuePop(Queue* pq)
{    //檢查隊列是否為空assert(!QueueEmpty(pq));//如果隊列只有一個元素if (pq->phead == pq->ptail){pq->phead = pq->ptail = NULL;}else{    //定義一個新結點來保存出隊后的頭結點QueueNode* ptem = pq->phead->next;free(pq->phead); pq->phead = ptem;}
}    

取隊頭就很簡單了,也是直接寫

//取隊頭
QueueDataType QueueFront(Queue* pq)
{//檢查隊列是否為空assert(!QueueEmpty(pq));return pq->phead->data;
}

取隊尾更是無需多言

//取隊尾的數據    
void QueueBack(Queue* pq)
{assert(!QueueEmpty(pq));return pq->ptail->data;
}

?

(三)銷毀隊列

最后的環節也必然是我們的銷毀隊列

//銷毀隊列    
void QueueDestroy(Queue* pq)
{assert(pq);//新定義一個結點用來遍歷隊列QueueNode* pcur = pq->phead;//開始遍歷鏈表銷毀while (pcur){    //再新定義一個結點來保存下一個節點QueueNode* ptem = pcur->next;free(pcur);pcur = ptem;}pq->phead = pq->ptail = NULL;
}

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

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

相關文章

mapbox進階,使用本地dem數據,加載hillshade山體陰影圖層

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??hillshade 山體陰影圖層 api1.3.1 ??…

量子糾錯碼實戰:從Shor碼到表面碼

引言:量子糾錯的必要性 量子比特的脆弱性導致其易受退相干和噪聲影響,單量子門錯誤率通常在10?~10?量級。量子糾錯碼(QEC)通過冗余編碼測量校正的機制,將邏輯量子比特的錯誤率降低到可容忍水平。本文從首個量子糾錯…

10. git switch

基本概述 git switch是 Git 2.23 版本之后新增的命令&#xff0c;專門用于切換分支&#xff0c;目的是替代 git checkout 中與分支操作相關的功能&#xff0c;使命令語義更清晰、更安全。 基本用法 1.切換到已有分支 git switch <branch-name>常用選項 1.從當前分支…

LeetCode 熱題 100 堆

215. 數組中的第K個最大元素 給定整數數組 nums 和整數 k&#xff0c;請返回數組中第 **k** 個最大的元素。 請注意&#xff0c;你需要找的是數組排序后的第 k 個最大的元素&#xff0c;而不是第 k 個不同的元素。 你必須設計并實現時間復雜度為 O(n) 的算法解決此問題。 示例 …

PIXOR:基于LiDAR的3D檢測模型解析

目錄 1、前言 2、PIXOR介紹 2.1. 什么是PIXOR&#xff1f; 2.2. PIXOR如何工作&#xff1f; 3、表現和應用 3.1、PIXOR的性能表現 3.2、PIXOR的應用場景 3.3、PIXOR的局限性與挑戰 4. PIXOR的未來展望 5. 結語 1、前言 自動駕駛技術正以前所未有的速度發展&#xff…

Vue中權限控制的方案

文章目錄 源碼&#xff1a;一、頁面級1.1、路由守衛1.2、動態路由 二、按鈕級別2.1、通過v-if來判斷2.2、通過組件包裹的方式來判斷2.3、通過自定義指令的方式 三、接口級別 源碼&#xff1a; https://gitee.com/liu-qiang-yyds/sysPermission 一、頁面級 1.1、路由守衛 前端…

【OSG學習筆記】Day 1: OSG初探——環境搭建與第一個3D窗口

什么是 OSG&#xff1f; 全稱&#xff1a;OpenSceneGraph&#xff08;開源場景圖&#xff09; 定位&#xff1a;一個基于 C/OpenGL 的高性能開源3D圖形開發工具包&#xff0c;專注于實時渲染和復雜場景管理。 核心思想&#xff1a;通過 場景圖&#xff08;Scene Graph&#xf…

Kubernetes 入門篇之網絡插件 calico 部署與安裝

在運行kubeadm init 和 join 命令部署好master和node節點后&#xff0c;kubectl get nodes 看到節點都是NotReady狀態&#xff0c;這是因為沒有安裝CNI網絡插件。 kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Not…

游戲開發中 C#、Python 和 C++ 的比較

&#x1f3ac; Verdure陌矣&#xff1a;個人主頁 &#x1f389; 個人專欄: 《C/C》 | 《轉載or娛樂》 &#x1f33e; 種完麥子往南走&#xff0c; 感謝您的點贊、關注、評論、收藏、是對我最大的認可和支持&#xff01;?? 摘要&#xff1a; 那么哪種編程語言最適合游戲開發…

LabVIEW真空度監測與控制系統

開發了一種基于LabVIEW的真空度信號采集與管理系統&#xff0c;該系統通過圖形化編程語言實現了真空度的高精度測量和控制。利用LabVIEW的強大功能&#xff0c;研制了相應的硬件并設計了完整的軟件解決方案&#xff0c;以滿足工業應用中對真空度監測的精確要求。 項目背景 隨著…

checkra1n越獄出現的USB error -10問題解決

使用checkra1n進行越獄是出現&#xff1a; 解決辦法(使用命令行進行越獄)&#xff1a; 1. cd /Applications/checkra1n.app/Contents/MacOS 2. ./checkra1n -cv 3. 先進入恢復模式 a .可使用愛思助手 b. 或者長按home,出現關機的滑條&#xff0c;同時按住home和電源鍵&#…

spring boot 中 WebClient 與 RestTemplate 的對比總結

以下是 WebClient 與 RestTemplate 的對比總結&#xff0c;以純文本表格形式呈現&#xff1a; 核心特性對比 特性RestTemplateWebClient線程模型同步阻塞&#xff1a;每個請求占用線程&#xff0c;直到響應返回。異步非阻塞&#xff1a;基于事件循環&#xff0c;高效處理高并發…

深入淺出SPI通信協議與STM32實戰應用(W25Q128驅動)(實戰部分)

1. W25Q128簡介 W25Q128 是Winbond推出的128M-bit&#xff08;16MB&#xff09;SPI接口Flash存儲器&#xff0c;支持標準SPI、Dual-SPI和Quad-SPI模式。關鍵特性&#xff1a; 工作電壓&#xff1a;2.7V~3.6V分頁結構&#xff1a;256頁/塊&#xff0c;每塊16KB&#xff0c;共1…

STM32 HAL庫之EXTI示例代碼

外部中斷按鍵控制LED燈 在main.c中 HAL_Init(); 初始化Flash&#xff0c;中斷優先級以及HAL_MspInit函數&#xff0c;也就是 stm32f1xx_hal.c 中 HAL_StatusTypeDef HAL_Init(void) {/* Configure Flash prefetch */ #if (PREFETCH_ENABLE ! 0) #if defined(STM32F101x6) || …

查看手機在線狀態,保障設備安全運行

手機作為人們日常生活中不可或缺的工具&#xff0c;承載著溝通、工作、娛樂等多種功能。保障手機設備的安全運行是我們每個人都非常重要的任務&#xff0c;而了解手機的在線狀態則是其中的一環。通過挖數據平臺提供的在線查詢工具&#xff0c;我們可以方便快捷地查詢手機號的在…

Llama 4全面評測:官方數據亮眼,社區測試顯不足之處

引言 2025年4月&#xff0c;Meta正式發布了全新的Llama 4系列模型&#xff0c;這標志著Llama生態系統進入了一個全新的時代。Llama 4不僅是Meta首個原生多模態模型&#xff0c;還采用了混合專家(MoE)架構&#xff0c;并提供了前所未有的上下文長度支持。本文將詳細介紹Llama 4…

淘寶API驅動跨境選品:多語言詳情頁自動翻譯與本地化定價

淘寶 API 驅動跨境選品實現多語言詳情頁自動翻譯與本地化定價&#xff0c;為跨境電商業務帶來諸多便利與優勢&#xff0c;以下是詳細介紹&#xff1a; 一、多語言詳情頁自動翻譯 技術原理 借助淘寶的 API 接口&#xff0c;獲取商品詳情頁的各類文本信息&#xff0c;包括標題、描…

MFC工具欄CToolBar從專家到小白

CToolBar m_wndTool; //創建控件 m_wndTool.CreateEx(this, TBSTYLE_FLAT|TBSTYLE_NOPREFIX, WS_CHILD | WS_VISIBLE | CBRS_FLYBY | CBRS_TOP | CBRS_SIZE_DYNAMIC); //加載工具欄資源 m_wndTool.LoadToolBar(IDR_TOOL_LOAD) //在.rc中定義&#xff1a;IDR_TOOL_LOAD BITMAP …

【Java面試系列】Spring Boot微服務架構下的分布式事務處理與性能優化詳解 - 3-5年Java開發必備知識

【Java面試系列】Spring Boot微服務架構下的分布式事務處理與性能優化詳解 - 3-5年Java開發必備知識 引言 在當今的微服務架構中&#xff0c;分布式事務處理和性能優化是面試中經常被問及的高頻話題。隨著系統規模的擴大&#xff0c;如何保證數據一致性和系統性能成為了開發者…

【動態規劃】 深入動態規劃—兩個數組的dp問題

文章目錄 前言例題一、最長公共子序列二、不相交的線三、不同的子序列四、通配符匹配五、交錯字符串六、兩個字符串的最小ASCII刪除和七、最長重復子數組 結語 前言 問題本質 它主要圍繞著給定的兩個數組展開&#xff0c;旨在通過對這兩個數組元素間關系的分析&#xff0c;找出…