二次學習C語言補充2

文章目錄

  • 表棧、隊列、二叉樹
    • 一、二叉樹
    • 二、表棧
    • 三、隊列
  • 鏈表
    • 一、單向鏈表
    • 二、循環鏈表、雙向鏈表和雙向循環鏈表
  • 預處理
    • 一、預處理
    • 二、宏定義
  • 文件
    • 文件操作補充

本篇文章是對二次學習C語言12——文件操作 二次學習C語言14——預處理及模塊化 二次學習C語言15——鏈表 二次學習C語言17——棧、隊列、二叉樹的部分補充說明,感興趣的話可以了解一下,這一系列C語言blog不會很仔細,主要是幫助有一些C語言基礎但想快速回顧一下的友友;但也不會質量很差,不然就失去了它存在的意義。還是很希望大家在相應blog評論區多多指出疑惑或分享實際問題的,這樣我們就可以共同進步啦!

表棧、隊列、二叉樹

一、二叉樹

  • 二叉樹的遍歷

分三種:

  1. 先序遍歷,根 左 右
  2. 中序遍歷,左 根 右
  3. 后序遍歷,左 右 根

在這里插入圖片描述

	* 先序遍歷(根左右):ABCDEFGHK
A為根先左B,B為根僅右C,C為根僅左D,D無左右,
A為根后右E,E為根僅右F,F為根僅左G,G為根先左H后右K
下面以對應規則類推* 中序遍歷(左 根 右):BDCAEHGKF* 后序遍歷(左 右 根):DCBHKGFEA

樹型結構是以分支關系定義的層次結構,它是一種重要的非線性結構

樹(tree) 是由一個或多個結點組成的有限集合T 。

  1. 一個特定的結點稱為該樹的根(root)結點
  2. 結點之外的其余結點可分為m(m ≥ 0)個互不相交的有限集合 T1 ,T2 ,…,Tm ,且其中每一個集合本身又是一棵樹,稱之為根的子樹(subtree)

注意:
樹的遞歸定義刻畫了樹的固有特性:一棵非空樹是由若干棵子樹構成的,而子樹又可由若干棵更小的子樹構成。

樹結構的基本術語如下。

結點的度(Degree):樹中的一個結點擁有的子樹數目,如:A結點的度為2

樹的度:是指該樹中結點的最大度數。如樹T的度為2。

葉子結點(Leaf) 或終端結點:度為零的結點。如D、H、K都是葉子結點。

分支結點或非終端結點:度不為零的結點。A、B、C、E、F、G都是分支結點。

孩子結點或兒子:樹中某個結點的子樹之根。如A的孩子結點為B、E。

雙親結點或父親:孩子結點的上層結點。

兄弟結點(Sibling):同一個雙親的孩子。

結點的層數(Level):從根起算,根的層數為1,它的孩子的層數為2……若某結點在第i層,它的孩子結點就在第i+1層。

樹的高度(Height)深度(Depth):樹中結點的最大層數。如樹T的高度為5

有序樹(OrderedTree):將樹中每個結點的各子樹看成是從左到右有次序的(即不能互換),二叉樹就是有序樹。(二叉樹的左子樹和右子樹是嚴格區分并且不能隨意顛倒的

  • 二叉樹的性質
  1. 性質1: 二叉樹第i層上的結點數目最多為2i-1(i≥1)
  2. 性質2: 深度為k的二叉樹至多有2k-1個結點(k≥1)
  3. 性質3: 在任意一棵二叉樹中,若葉子結點(即度為0的結點)的個數為n0,度為1的結點數為n1,度為2的結點數為n2,則no=n2+1

滿二叉樹(FullBinaryTree) :一棵深度為k且有2k-1個結點的二叉樹稱為滿二叉樹。

其特點:
1.每一層上的結點數都達到最大值。即如果高度確定,它是具有最多結點數的二叉樹。

2.滿二叉樹中不存在度數為1的結點,每個分支結點均有兩棵高度相同的子樹,且樹葉都在最下一層上。

完全二叉樹(Complete BinaryTree) :若一棵二叉樹至多只有最下面的兩層上結點的度數可以小于2,并且最下一層上的結點都集中在該層最左邊的若干位置上,則此二叉樹稱為完全二叉樹。

其特點:
1.滿二叉樹是完全二叉樹,完全二叉樹不一定是滿二叉樹。
2.在滿二叉樹的最下一層上,從最右邊開始連續刪去若干結點后得到的二叉樹仍然是一棵完全二叉樹。
3.在完全二叉樹中,若某個結點沒有左孩子,則它一定沒有右孩子,即該結點必是葉結點。

二叉樹的存儲結構有多種,最常用的有兩種:是順序存儲結構鏈表存儲結構

優點和缺點
① 對完全二叉樹而言,順序存儲結構既簡單又節省存儲空間。

② 一般的二叉樹采用順序存儲結構時,雖然簡單,但易造成存儲空間的浪費。

③ 在對順序存儲的二叉樹做插入和刪除結點操作時,要大量移動結點。

二、表棧

  • 線性表

    最簡單、最常用的一種數據結構,是具有相同數據類型的n(n≥0)個數據元素(結點)的有限序列。通常記為:(a1,a2,…,an )。其中n稱為線性表的長度,當n=0的時表示空表。

    • ①順序表

    用一段連續的內存空間來存儲線性表的數據元素,C語言中是通過數組來實現

    • ②鏈表

即二次學習C語言15——鏈表

  • 棧(zhan)

==堆棧(Stack)==可以看成是一種“特殊的“線性表,這種線性表上的插入和刪除運算限定在表的某一端進行的。

先進后出(FILO)的特點也可以描述為后進先出,簡稱為LIFO表

  1. 通常稱插入、刪除的這一端為棧頂(Top),另一端稱為棧底(Bottom)
  2. 當表中沒有元素時稱為空棧
  3. 退棧:刪除。
  4. 進棧:插入。

三、隊列

隊列(Queue) 是只允許在一端進行插入,而在另一端進行刪除的運算受限的線性表。

  1. 允許刪除的一端稱為隊頭(Front)

  2. 允許插入的一端稱為隊尾(Rear)

  3. 當隊列中沒有元素時稱為空隊列

  4. 隊列簡稱為FIFO表

鏈表

一、單向鏈表

在鏈表結構中,每個節點僅存儲本身需要存儲的數據和下一個節點地址的這種鏈表結構,我們稱為單向鏈表結構

數組與鏈表對比①:

數組在進行數據的插入,刪除操作時,為了保證內存數據的連續性,往往需要做大量的數據搬移工作,所以時間復雜度是O(n)

鏈表中插入或刪除數據時,因為鏈表結構中的節點并不需要連續的存儲空間,所以在鏈表中進行數據的插入和刪除時并不需要搬移節點。對于鏈表的刪除和插入操作,我們只需要調整相鄰節點的后繼指針即可,所以對應的時間復雜度是O(1)

數組與鏈表對比②:

數組的內存數據是連續的,當我們需要訪問第k個元素時,通過基地址(base_address)和數據類型大小就可以隨機訪問到數據所在的內存地址,時間復雜度是O(1)

對于鏈表來講,因為鏈表中各個節點的數據在內存中時分散的,不像數組那樣是連續的存儲空間,所以要訪問鏈表中的第k個元素,只能從頭結點開始,根據節點間的后繼指針或引用逐一遍歷,直到找到相應的節點,所以鏈表的隨機訪問的性能沒有數組好,時間復雜度為O(n)

二、循環鏈表、雙向鏈表和雙向循環鏈表

將單鏈表的尾節點從指向空地址NULL調整為指向頭結點Head,就形成了循環鏈表

和單鏈表相比,循環鏈表的優點是從鏈尾到鏈頭比較方便。當要處理的數據具有環型結構特點時,就特別適合采用循環鏈表。

雙向鏈表支持兩個方向,每個節點不止只有一個后繼指針或者引用Next指向后繼節點,還有一個前驅指針或者引用Prev指向前面的節點

從雙向鏈表的結構看,雙向鏈表可以在O(1)的時間復雜度下找到前驅節點,基于此特性,在某些特殊的場景下,對節點的刪除和插入操作,雙向鏈表比單向鏈表會更高效.

上面我們說了單向鏈表、循環鏈表、雙向鏈表,我們將循環鏈表和雙向鏈表整合在一起,就形成了雙向循環鏈表。

不過,數組和鏈表的對比,并不能局限于時間復雜度。而且,在實際的軟件開發中,不能僅僅利用復雜度分析就決定使用哪個數據結構來存儲數據,一切都要根據具體情況具體分析,合適最好。

預處理

一、預處理

編譯預處理是在對源程序正式編譯之前的處理,以“#”開頭,如文件包含“#include”、宏定義“#define”等。預處理命令不是C語言本身的組成部分,不能直接對它進行編譯。所有的預處理指令都是在編譯之前完成的,不占用程序運行時間。

二、宏定義

  • 注意事項
  1. 宏名習慣采用大寫,以便與普通變量區分;

  2. 宏定義不是C語句,所以不能在行尾加分號;否則,宏展開時,會將分號也算在內

  3. 在宏展開時,預處理程序僅按宏定義簡單替換宏名,不做任何檢查。如果有錯誤,只能由編譯器在編譯宏展開后的源程序時發現。

  4. 宏定義的位置是任意的,宏名的有效范圍是從定義命令處到本模塊結束。通常寫在文件開頭處。

  5. 宏調用時,是原樣替換,不進行任何轉換。

  • #define常量定義typede數據類型定義的異同點:

#define P_INT int* //在編譯前執行 (原樣替換)

typedef int* P_INT //在編譯時執行

相同點:都是定義了一個int指針類型的別名

不同點:用#define時,P_INT a, b;相當于int* a, b;即int*a; int b;此時b不是int *,而是int

用typedef時,P_INT a, b;相當于int *a; int *b;

文件

文件操作補充

  • 文件操作的兩種方式
  1. 基于文件描述符1的文件操作,無緩沖區,也稱為低級文件的操作,屬于底層文件系統,函數90多個。
  1. 基于文件指針的訪問操作,帶緩沖區,稱為高級的文件操作,屬于高級文件系統,也是標準C文件操作庫函數, ANSI C庫函數 300多個.

注意:在實操中,我使用的是fwritefread,故生成的數據文件打開后是無法正常閱讀的,全是二進制數(相當于一層加密);若想正常閱讀生成的數據文件,可使用fprintffscanf


  1. 文件描述符:就是數字,0,1,2分別表示標準輸入,標準輸出,標準出錯 ??

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

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

相關文章

2.9Vue創建項目(組件)的補充

1.再創建和引入vue的選擇2.VsCode插件 安裝Vue自己搜索最新的3.style自己的作用域在一個組件中引入另一個文件的子組件,給當前組件設置樣式,那么子組件的樣式也會改變的。為了解決這個問題 我們在自己的style中設置一個屬性4.另一種創建vue 的方式(主流…

算法高頻題

刷題:LeetCode(Top 100-150題,至少刷兩遍)。重點:鏈表、樹、二分查找、動態規劃、回溯、棧/隊列。 每一個題型,前10個高頻題 算法思考框架參考:算法題思維框架-CSDN博客 高頻順序參考網站&…

服務器安裝 LDOPE(MODIS 數據處理工具)

目錄下載方式1-(簡單快捷)根據WRF-VPRM 需要打補丁下載方式2:(手動安裝依賴)一、安裝所需依賴庫(4 個主庫 2 個基礎庫)另- HDF-EOS 手動編譯二、解壓并安裝 LDOPE參考下載方式1-(簡…

克隆代幣 + 捆綁開盤:多鏈環境下的低成本發幣玩法

在加密世界,發幣已經不再是“少數開發者的專利”。隨著工具的普及,任何人都可以快速發行一個在加密世界,發幣已經不再是“少數開發者的專利”。隨著工具的普及,任何人都可以快速發行一個代幣。但問題是:如何在保證低成…

數據結構中的 二叉樹

1.前言 在 Java 中,樹(Tree)是一種非線性數據結構,由節點(Node)組成,常見的線性表則是我們之前學過的順序表、鏈表、棧、隊列等等。每個節點包含數據和指向子節點的引用。樹的常見實現方式包括二…

IntelliJ IDEA 啟動項目時配置端口指南

🌟 一、為什么需要手動設置啟動端口? 默認情況下,Spring Boot 應用會使用 8080 端口啟動。但在以下場景中,我們必須自定義端口: 多個微服務同時運行,需避免端口沖突;團隊協作開發,統…

spark sql之from_json函數

目錄前言函數語法參數說明返回值案例案例1案例2前言 在Spark SQL中,from_json函數用于解析包含JSON字符串的列,并將其轉換為Spark SQL的結構化類型(如struct、map或array) 函數語法 from_json(jsonStr, schema [, options])參數…

數據結構 之 【位圖的簡介】

目錄 1.位圖的引入 2.位圖概念 3.位圖的實現 3.1前提準備 3.2set 3.3reset 3.4test 4.位圖的應用 1.位圖的引入 給40億個不重復的無符號整數,沒排過序 再給一個無符號整數,如何快速判斷這個無符號整數是否在 這40億個數中 首先,一個…

[iOS] ViewController 的生命周期

文章目錄前言一、UIViewController 生命周期有關函數二、UIViewController 中函數的執行順序運行結果1.present和dismiss2.push和pop三、總結前言 UIViewController 是在 iOS 開發中一個非常重要的角色,他是 view 和 model 的橋梁,通過 UIViewControlle…

第30章 零售與電商AI應用

本章將深入探討人工智能在零售與電商領域的革命性應用。我們將從智能推薦系統、動態定價、庫存管理到創新的虛擬試衣間,全面解析AI如何重塑購物體驗和商業運營效率,并為每個關鍵技術點提供代碼實戰,幫助你掌握將AI應用于真實商業場景的能力。…

QT通過QModbusRtuSerialMaster讀寫電子秤數據實例

一、電子稱常用功能:稱重、清零、去皮;電子秤的通訊方式:Modbus通信、串口通信。二、QT讀寫電子秤軟件界面如下:三、核心代碼如下:.pro項目文件代碼:QT core gui serialbus serialport.h頭文件代碼#…

sqlmap常用命令

ZZHow(ZZHow1024) 一、掃描注入點 1.GET方法,給URL: #探測該url是否存在漏洞 python sqlmap.py -u "http://192.168.10.1/sqli/Less-1/?id1"#如果我們已經知道admin這里是注入點的話,可以在其后面加個*來讓sqlmap對其注入 python …

JVM如何排查OOM

當JVM(Java虛擬機)出現OOM(OutOfMemoryError)時,可以按照以下步驟和方法,用于幫助定位和解決JVM中的OOM問題1.查看異常堆棧信息查看異常堆棧信息(StackTrace)是定位問題的關鍵。OOM異…

存算一體芯片生態評估:從三星PIM到知存科技WTM2101

點擊 “AladdinEdu,同學們用得起的【H卡】算力平臺”,注冊即送-H卡級別算力,80G大顯存,按量計費,靈活彈性,頂級配置,學生更享專屬優惠。 引言:存算一體技術的崛起與意義 在傳統馮諾…

[數據結構] 棧 · Stack

一.棧 stack 1.概念 棧 : 一種特殊的線性表 , 其只允許再固定的一段進行插入和刪除元素操作 進行數據插入和刪除操作的一段稱為 棧頂 ; 另一端稱為棧底棧中的數據元素遵循 先進后出 原則(LIFO)壓棧 : 棧的插入操作叫做 進棧 或 壓棧 或 入棧 , 入數據在棧頂出棧 : 棧的刪除…

MySQL執行過程中如何選擇最佳的執行路徑

本篇文章介紹一個非常核心的數據庫問題。MySQL 選擇最佳執行路徑(即“查詢優化”)的過程是由其查詢優化器(Query Optimizer) 完成的。 簡單來說,優化器的目標是:在多種可能的執行方案中,選擇一個…

【設計模式】從游戲角度開始了解設計模式 --- 抽象工廠模式

永遠記住,你的存在是有意義的, 你很重要, 你是被愛著的, 而且你為這個世界帶來了無可取代的東西。 -- 麥克西 《男孩、鼴鼠、狐貍和馬》-- 從零開始了解設計模式抽象工廠模式抽象工廠模式 今天我們一起來探究抽象工廠模式&#x…

tensorflow.js 使用場景

TensorFlow.js (簡稱 TF.js) 是一個利用 WebGL 和 Node.js 在瀏覽器和服務器端進行機器學習模型訓練和部署(推理)的 JavaScript 庫。它的核心價值在于將機器學習的能力帶入了 Web 開發者和 JavaScript 生態的領域。 其主要應用場景可以分為以下幾大類: 一、在瀏覽器中直接進…

詳解mcp以及agen架構設計與實現

文章目錄1.MCP概念2.MCP服務端主要能力3.MCP技術生態4.MCP與Function call區別5.MCP生命周期6.MCP java SDK7.MCP應用場景8.基于springAIollma阿里qianwenmcp設計私有AIAgent應用實現9.AI java項目落地技術選型10.構建AI Agent四大模塊11.LLM(大模型)與MCP之間關系12.A2A、MCP、…

六級第一關——下樓梯

上目錄: 目錄 題目描述 輸入格式 輸出格式 輸入輸出樣例 說明/提示 一、DP的意義以及線性動規簡介 在一個困難的嵌套決策鏈中,決策出最優解。 二、動態規劃性質淺談 三、子序列問題 (一)一個序列中的最長上升子序列&am…