c語言的數據結構:隊列

1.隊列存在的實現方式及其存在意義

1.1為什么隊列使用單鏈表實現更好

  1. 動態內存分配:鏈表在C語言中通常使用動態內存分配,這意味著可以在運行時根據需要動態地添加或刪除節點。這對于實現一個動態大小的隊列非常有用,因為隊列的大小可以在運行時變化。相比之下,數組的大小通常是固定的,需要在編譯時確定,這可能會限制隊列的靈活性。
  2. 插入和刪除效率:在鏈表中,插入和刪除操作的時間復雜度為O(1)(在已知位置的情況下)。這意味著在鏈表的頭部或尾部添加或刪除節點非常高效。由于隊列是一種先入先出(FIFO)的數據結構,我們通常在隊列的尾部添加元素(入隊),并在頭部刪除元素(出隊)。因此,使用鏈表實現隊列可以充分利用其高效的插入和刪除操作。
  3. 空間效率:鏈表只存儲節點本身的數據和指向下一個節點的指針,不需要像數組那樣預留一定的空間。這使得鏈表在存儲大量數據時更為空間高效.

1.2 隊列存在的意義

無論是棧,隊列,抑或是樹,它們基本都是由順序表,鏈表這些基本的元素構成的,并且人們將棧,隊列等一些數據結構發明出來也是為了根據人類的需求解決人類的一些問題,舉一個例子,醫院叫號排隊,為了防止有些人亂插隊從而引起的不必要的糾紛,于是以數據結構隊列為基本原理開發出有關排隊就醫的系統?

2.有關隊列的一些基本操作如何使用c語言代碼將其具現化

2.1如何寫一個隊列的結點

typedef int QDataType;
typedef struct QueueNode
{
?? ?int val;
?? ?struct QueueNode* next;
}QNode;

typedef struct Queue
{
?? ?QNode* phead; // 指向隊列頭部的指針 ?
?? ?QNode* ptail; ?// 指向隊列尾部的指針 ?
?? ?int size;
} Queue;

如果只是寫一個隊列的結點

然后在之后的對隊列的操作每次都去再設置一個頭指針和尾指針如果我們需要去找隊列的尾結點,那么就需要尾指針每次都從頭開始去遍歷整個鏈表的結點,但是這樣做的話時間復雜度便可以來到O(n),是不合情的

所以我們在最初設置隊列的結點相關基礎信息的時候就連帶著將它的頭指針和尾指針一并設置好.

設置兩個結點指針phead和ptail,例如我們每次進行一次尾插操作,就讓ptail指向新的尾結點,如此一來,ptail便一直指向尾結點,每當我們需要取去尋找尾結點是,可以直接使用ptail,就不需要再去從頭開始遍歷了.

2.2隊列的初始化操作

void QueueInit(Queue* pq)
{
?? ?assert(pq);//pq是指向結構體的指針
?? ?pq->phead = NULL;
?? ?pq->ptail = NULL;
?? ?pq->size = 0;
}

2.3隊列的銷毀操作

//銷毀操作
void QueueDestroy(Queue* pq)
{
?? ?assert(pq);
?? ?QNode* cur = pq->phead;//從頭開始銷毀,和出隊一樣
?? ?while (cur != NULL)
?? ?{
?? ??? ?QNode* nexttemp = cur->next;
?? ??? ?free(cur);
?? ??? ?cur = nexttemp;
?? ?}

?? ?pq->phead = pq->ptail = NULL;
?? ?pq->size = 0;
}

?QNode* nexttemp = cur->next;

這一步的意思是為了保證在將cur目前所指向的結點刪除以后還可以定位到原被刪除結點的下一個結點,所以事先將下一個結點cur->next用創建的臨時變量nexttemp保存起來,待目前結點被刪除以后,cur又快速指向下一個結點cur->next結點.

2.4入隊操作

//入隊
void QueuePush(Queue* pq,QDataType x)
{
?? ?assert(pq);
?? ?QNode* newnode = (QNode*)malloc(sizeof(QNode));
?? ?if (newnode == NULL)
?? ?{
?? ??? ?perror("malloc fail");
?? ??? ?return;
?? ?}
?? ?newnode->val = x;
?? ?newnode->next = NULL;
?? ?if (pq->ptail = NULL)//啥都沒有
?? ?{
?? ??? ?pq->ptail = pq->phead = newnode;

?? ?}
?? ?else//本來就有結點
?? ?{
?? ??? ?pq->phead->next = newnode;
?? ??? ?pq->ptail = newnode;
?? ?}
?? ?pq->size++;
}

2.5出隊操作

//出隊
void QueuePop(Queue* pq)
{
?? ?assert(pq);
?? ?//暴力檢查
?? ?//至少要有一個結點才可以進行銷毀操作

?? ?assert(pq->phead!=NULL);
?? ??
?? ?if (pq->phead->next == NULL)
?? ?{
?? ??? ?free(pq->phead);
?? ??? ?pq->phead = pq->ptail = NULL;
?? ?}
?? ?else
?? ?{
?? ??? ?QNode* nexttemp = pq->phead->next;
?? ??? ?free(pq->phead);
?? ??? ?pq->phead = nexttemp;
?? ?}
?? ?pq->size--;
}

2.6取頭操作

//取頭
QDataType ?QueueFront(Queue* pq)
{
?? ?assert(pq);
?? ?//要有首結點才可以進行取頭操作
?? ?assert(pq->phead != NULL);
?? ?return pq->phead->val;
}

2.7取尾操作

//取尾
QDataType QueueBack(Queue* pq)
{
?? ?assert(pq);
?? ?//要有尾結點才可以進行取尾操作
?? ?assert(pq->ptail != NULL);
?? ?return pq->ptail->val;
}

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

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

相關文章

界面控件Telerik UI for ASP. NET Core教程 - 如何為網格添加上下文菜單?

Telerik UI for ASP.NET Core是用于跨平臺響應式Web和云開發的最完整的UI工具集,擁有超過60個由Kendo UI支持的ASP.NET核心組件。它的響應式和自適應的HTML5網格,提供從過濾、排序數據到分頁和分層數據分組等100多項高級功能。 上下文菜單允許開發者為應…

[unity] c# 擴展知識點其一 【個人復習筆記/有不足之處歡迎斧正/侵刪】

.NET 微軟的.Net既不是編程語言也不是框架,是類似于互聯網時代、次時代、21世紀、信息時代之類的宣傳口號,是一整套技術體系的統稱,或者說是微軟提供的技術平臺的代號. 1.跨語言 只要是面向.NET平臺的編程語言(C#、VB、 C、 F#等等),用其中一種語言編寫…

帶著問題閱讀源碼——Spring MVC是如何將url注冊到RequestMappingHandlerMapping?

背景 在 Spring MVC 中,DispatcherServlet 是前端控制器(front controller),它負責接收所有的 HTTP 請求并將它們映射到相應的處理器(handler)。為了實現這一點,Spring MVC 使用了適配器模式將…

大街款商城項目03-微服務之間調用

目錄 RestTemplate OpenFeign 1.引入依賴open-feign 2.聲明要調用的服務和接口 3.注入FeignClient啟用 4驗證 RestTemplate 在微服務架構中,使用RestTemplate是一種常見的方式進行服務間的HTTP通信。以下是一個簡單的示例,演示如何使用RestTempla…

Android minigbm框架普法

Android minigbm框架普法 引言 假設存在這么一個場景,我的GPU的上層實現走的不是標準的Mesa接口,且GPU也沒有提專門配套的gralloc和hwcompoer實現。那么我們的Android要怎么使用到EGL和GLES庫呢,并且此GPU驅動是支持drm實現的,也有…

Galaxy生信云平臺:集合操作工具大全

Galaxy平臺上的文件稱為數據集(Dataset),如果將多個文件組合在一起,則形成數據集合(Dataset collection)。 上傳文件后,可以通過工具將文件構建成數據集合。具體操作可以參考前面介紹轉錄組流程…

后臺組件體系

從今天開始進入更細粒度說明。后臺微服務是由組件構成的。平臺的開發理念是為甲方打造一個生態環境。安裝實施時為客戶安裝私倉來管理組件。開發微服務時鼓勵拆分為組件。開發新功能時,先看有沒有相關組件,有的話就在pom.xml文件(不要問我這個…

OpenDDS中避免訂閱發布同一主題時的自環現象(適用于所有DDS)

目錄 1、摘要2、理解"自反傳輸"2、解決方案2.1、使用 DataReaderListener 進行過濾3.2、使用 Partition 進行隔離3.3、 使用不同的 Topic 總結 1、摘要 在 OpenDDS 中,同時訂閱并發布同一主題會導致自環現象,即接收到自己發送的消息。本文介紹…

Day10:基礎入門-HTTP數據包Postman構造請求方法請求頭修改狀態碼判斷

目錄 數據-方法&頭部&狀態碼 案例-文件探針 案例-登錄爆破 工具-Postman自構造使用 思維導圖 章節知識點: 應用架構:Web/APP/云應用/三方服務/負載均衡等 安全產品:CDN/WAF/IDS/IPS/蜜罐/防火墻/殺毒等 滲透命令:文件…

最新消息:英特爾宣布成立全新獨立運營的FPGA公司——Altera

今天,英特爾宣布成立全新獨立運營的FPGA公司——Altera(2015年6月Intel以 167 億美元的價格,收購FPGA廠商Altera)。首席執行官Sandra Rivera和首席運營官Shannon Poulin分享展示其在超過550億美元的市場中保持領先性的戰略規劃&am…

什么是端點安全以及如何保護端點

什么是端點安全 端點是指可以接收信號的任何設備,是員工使用的一種計算設備,用于保存公司數據或可以訪問 Internet。端點的幾個示例包括:服務器、工作站(臺式機和筆記本電腦)、移動設備、虛擬機、平板電腦、物聯網、可…

一【初識EMC】

在作為硬件行業相關從業者,經常接觸到EMC相關問題,下面來簡單介紹下EMC相關方面的知識 文章目錄 前言一、生活中的EMC現象?二、EMC是什么三、EMC的三要素四、EMI與EMS的評估方式1.RE2.CE3.HAR4.FLICKER5.Rs6.CS7.ESD8.EFT9.DIP10.PMS11.surge…

Zookeeper3:客戶端命令

文章目錄 客戶端命令連接服務端Zookeeper客戶端內置命令 ls - 節點信息 客戶端命令 連接服務端Zookeeper //客戶端連接服務端zookeeper 默認連的本機2181端口的zookeeper cd /opt/module/zookeeper-3.9.1/bin && sh zkCli.sh//客戶端連接遠程服務端zookeeper cd /op…

【小塵送書-第十一期】編程的基石,開發的核心:《算法秘籍》

大家好,我是小塵,歡迎你的關注!大家可以一起交流學習!歡迎大家在CSDN后臺私信我!一起討論學習,討論如何找到滿意的工作! 👨?💻博主主頁:小塵要自信 &#x1…

R語言簡介|你對R語言了解多少?

R語言是一種專門用于統計計算和圖形展示的開源編程語言,它在數據科學領域有著廣泛的應用。下面對R語言的環境、基礎語法及注釋進行解釋: R語言環境 安裝與配置 安裝R語言通常可以從官方站點下載對應操作系統的安裝包,如Windows、Linux、ma…

lotus worker停止接單

worker停止接單 會做完當前的任務 lotus-worker set --enabledfalse# lotus-worker --worker-repo/worker01 set --enabledfalse DEPRECATED: This command will be removed in the future# lotus-worker --worker-repo/worker01 info Enabled: false參考 worker停止接單

如何使用GAP-Burp-Extension掃描潛在的參數和節點

關于GAP-Burp-Extension GAP-Burp-Extension是一款功能強大的Burp擴展,該工具在getAllParams擴展的基礎上進行了升級,該工具不僅可以幫助廣大研究人員在安全審計過程中掃描潛在的參數,而且還可以搜索潛在的鏈接并使用這些參數進行測試&#…

零基礎如何快速入門倫敦金交易

倫敦金交易是金融市場中備受關注的一種投資方式。對于想要學習如何炒倫敦金并快速開始交易的人來說,本文將為您提供一份全面而詳細的指南。無論您是初學者還是有經驗的交易者,本文都將幫助您了解倫敦金交易的基本知識,并提供一些實用的技巧和…

安卓與鴻蒙的區別

安卓和鴻蒙是兩個不同的操作系統。下面是它們的一些區別: 1. 公司:安卓是由谷歌開發的操作系統,而鴻蒙是由華為開發的操作系統。 2. 開放性:安卓是開放源代碼的操作系統,可以由各種手機制造商進行定制和使用。鴻蒙也…

協議-http協議-基礎概念03-http狀態碼-http特點-http性能-壓縮和分塊傳輸-范圍請求

參考來源: 極客時間-透視HTTP協議(作者:羅劍鋒); 01-狀態碼分類 開頭的 Version 部分是 HTTP 協議的版本號,通常是HTTP/1.1,用處不是很大。后面的 Reason 部分是原因短語,是狀態碼的簡短文字描述&#xff…