學習嵌入式第十八天

文章目錄

  • 1.數據結構
    • 1.概念
    • 2.衡量代碼質量和效率
      • 1.時間復雜度
      • 2.空間復雜度
    • 3.數據結構分類
      • 1.邏輯結構
      • 2.存儲結構
      • 3.常見的數據結構
  • 2.鏈表
      • 1.與順序表的區別
      • 2.鏈表分類
        • 1.單向鏈表
          • 1.定義鏈表節點類型
          • 2.空鏈表的創建
          • 3.鏈表的頭插法
          • 4.鏈表的遍歷
          • 5.鏈表元素刪除
  • 3.makefile
  • 習題

1.數據結構

1.概念

程序 ==數據結構 + 算法

  • 描述數據存儲和操作的結構

  • 操作數據對象的方法

2.衡量代碼質量和效率

在理想情況下,無論代碼操作數據量多大,都希望程序代碼的運行時間保持恒定。

因此,當代碼操作數據量增大的時候,代碼運行時間增速緩慢就表明代碼的質量和效率高,為了衡量這種數據量和時間的關系,引入時間復雜度和空間復雜度的概念

1.時間復雜度

數據量的增長與程序運行時間的增長所呈現的比例關系就稱為時間漸進復雜度函數,也就是時間復雜度

  • 常見的時間復雜度:
    • O(1):程序運行時間維持恒定
    • O(n):數據量和運行時間關系為線性
    • O(logn):數據量少時運行時間增長較快,數據量大時運行時間趨于穩定
    • O(nlogn),O(n2),O(n3),O(2^n)……

2.空間復雜度

數據的增長與程序占據空間的增長所呈現的比例函數關系,稱為空間復雜度

3.數據結構分類

1.邏輯結構

  • 線性結構:表(一對一)
  • 非線性結構:樹(一對多)、圖(多對多)

2.存儲結構

  • 順序存儲
  • 鏈式存儲
  • 散列存儲
  • 索引存儲

3.常見的數據結構

  • 順序表、鏈式表
  • 順序棧、鏈式棧
  • 順序隊列、鏈式隊列
  • 二叉樹、鄰接表、鄰接矩陣

2.鏈表

1.與順序表的區別

  • 順序表(數組)特點:
    • 存儲空間連續,訪問元素方便
    • 無法利用小的空間,空間必須連續
    • 順序表元素必須有限
    • 插入和刪除效率低
  • 鏈表特點:
    • 存儲空間可以不連續,訪問元素不方便
    • 可以利用一些小的存儲空間
    • 鏈表元素可以沒有上限
    • 插入和刪除效率高

2.鏈表分類

1.單向鏈表

只能通過鏈表節點找到后一個節點,訪問鏈表元素的方向是單向的

1.定義鏈表節點類型

代碼實現:

typedef int datatype;/*鏈表節點類型*/
typedef struct node {datatype data;          // 數據域,存放數據struct node *pnext;     // 指針域,指向下一個節點
} linknode;
2.空鏈表的創建
  • 創建一個空的鏈表節點
  • data不需要賦值,空白節點不存放數據,主要為了保證鏈表操作的便利性
  • pnext必須賦值為NULL,表示該節點為最后一個節點
  • 將節點地址返回

代碼實現:

linknode *create_empty_linklist(void){linknode *ptmpnode = NULL;ptmpnode = malloc(sizeof(linknode));if(ptmpnode == NULL){printf("filed to malloc");return NULL;}ptmpnode->pnext = NULL;return ptmpnode;
}
3.鏈表的頭插法
  • 申請新的節點空間
  • 將想要存放的數據存放到新申請的數據控件中
  • 將新申請節點的pnext賦值為空白節點的pnext
  • 將空白節點的pnext賦值為新申請節點

代碼實現:

int insert_head_linklist(linknode *phead,datatype tmpdata){linknode *ptmpnode = NULL;ptmpnode = malloc(sizeof(linknode));ptmpnode->data = tmpdata;ptmpnode->pnext = phead->pnext;phead->pnext = ptmpnode;return 0;
}
4.鏈表的遍歷

代碼實現:

方法一:while(p != NULL){p = p->pnext;}	//多用于遍歷鏈表所有元素
方法二:while(p->next != NULL){p = p->next;}	//多用于找出鏈表的最后一個節點
void show_linklist(linknode *phead){linknode *ptmpnode = NULL;ptmpnode = phead->pnext;while(ptmpnode != NULL){printf("%d ",ptmpnode->data);ptmpnode = ptmpnode->pnext;}printf("\n");return 0;
}
5.鏈表元素刪除
  • 定義兩個指針ptmpnode,pprenode,ptmpnode用來遍歷鏈表查找要刪除的元素,pprenode永遠指向ptmpnode的前一個節點
  • 當ptmpnode找到要刪除的節點元素,讓pprenode->pnext賦值為ptmpnode ->ptext
  • 將要刪除的元素釋放,再將ptmpnode賦值為pprenode->pnext
  • 讓ptmpnode判斷下一節點元素是否刪除,直到該指針指向NULL為止

代碼實現:

int delete_linklist(linknode *phead,datatype tmpdata){linknode *ptmpnode = NULL;linknode *pprenode = NULL;pprenode = phead;ptmpnode = phead->pnext;while(ptmpnode != NULL){if(ptmpnode->data == tmpdata){pprenode->pnext = ptmpnode->pnext;free(ptmpnode);ptmpnode = pprenode->pnext;}else{ptmpnode = ptmpnode->pnext;pprenode = pprenode->pnext;}}retuen 0;
}

3.makefile

工程管理工具,主要用來管理代碼的編譯

  • makefile可以根據文件中的規則來選擇符合條件的代碼完成編譯
  • makefile能夠根據依賴關系來決定哪些代碼需要編譯,哪些代碼不需要編譯

使用規則:

  • 在工程目錄下,新建一個makefile文件
  • 在makefile中編寫對應的文件編譯規則
  • 在工程目錄下使用make調用makefile中的規則完成代碼編譯
  • 編譯代碼成功后即可運行可執行程序

語法規則:

要生成的文件:依賴的所有文件
生成命令方式

習題

  1. 封裝一個函數返回鏈表中第一個指定元素節點的地址

    代碼實現:

    void search_linklist(linknode *phead, int tmpdata){linknode *ptmpnode = NULL;linknode *pprenode = NULL;ptmpnode = phead->pnext;pprenode = phead;while(ptmpnode != NULL){if(ptmpnode->data == tmpdata){printf("find it! %p\n", ptmpnode);return;}else{ptmpnode = ptmpnode->pnext;pprenode = pprenode->pnext;}}return;}
    
  2. 封裝一個函數將鏈表中指定元素的值更新為新值

代碼實現:

void change_linklist(linknode *phead, int tmpdata,int overdata){linknode *ptmpnode = NULL;linknode *pprenode = NULL;ptmpnode = phead->pnext;pprenode = phead;while(ptmpnode != NULL){if(ptmpnode->data == tmpdata){ptmpnode->data = overdata;}ptmpnode = ptmpnode->pnext;pprenode = pprenode->pnext;}return;}
  1. 封裝一個函數實現尾插法

代碼實現:

void insert_tail_linklist(linknode *phead,int tmpdata){linknode *ptmpnode = NULL;ptmpnode = phead->pnext;while(ptmpnode->pnext != NULL){ptmpnode = ptmpnode->pnext;}linknode *pnewnode = NULL;pnewnode = malloc(sizeof(linknode));ptmpnode->pnext = pnewnode;pnewnode->data = tmpdata;pnewnode->pnext = NULL;return;
}

LL){

       ptmpnode = ptmpnode->pnext;}linknode *pnewnode = NULL;pnewnode = malloc(sizeof(linknode));ptmpnode->pnext = pnewnode;pnewnode->data = tmpdata;pnewnode->pnext = NULL;return;

}

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

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

相關文章

基于SpringBoot+Vue實現校園商鋪系統

作者主頁:編程指南針 作者簡介:Java領域優質創作者、CSDN博客專家 、CSDN內容合伙人、掘金特邀作者、阿里云博客專家、51CTO特邀作者、多年架構師設計經驗、多年校企合作經驗,被多個學校常年聘為校外企業導師,指導學生畢業設計并參…

從資源閑置到彈性高吞吐,JuiceFS 如何構建 70GB/s 吞吐的緩存池?

AI 模型的訓練與推理對存儲系統提出了極為嚴苛的要求,特別是在高吞吐、高并發以及對海量小文件的高效處理方面,已成為三大主要挑戰。盡管基于 Lustre 或 GPFS 的并行文件系統具備出色的性能,但其成本高昂、吞吐能力與容量強耦合,可…

提升JVM性能之CMS垃圾回收器的優化分析與案例剖析

這里寫目錄標題一、CMS基本介紹二、CMS核心優化策略1. 避免并發模式失敗(Concurrent Mode Failure)2. 減少內存碎片3. 調優并發階段耗時4. 新生代優化配合三、典型案例解析案例1:電商服務頻繁Full GC案例2:金融交易系統碎片導致長…

Token系列 - 再談穩定幣

相關政策 2024年12月,歐洲《加密資產市場監管法案》正式成為法律2025年3月,日本細化了加密資產及穩定幣的監管調整2025年5月,英國發布了關于穩定幣發行、加密資產托管及加密資產公司財務穩健性的監管提案;2025年5月20日&#xff…

【20min 急速入門】使用Demucs進行音軌分離

創建環境 conda create --name mujica python3.10下載加速依賴 先用nvidia-smi檢查機器使用的獨顯版本, 然后從pytorch官網下載對應的GPU版torch, torchaudio 比如我的是12.2, 就下載11.8版本的 pip3 install torch torchvision torchaudio --index-url https://download.p…

字節Seed發布擴散語言模型,推理速度達2146 tokens/s,比同規模自回歸快5.4倍

用擴散模型寫代碼,不僅像開了倍速,改起來還特別靈活!字節Seed最新發布擴散語言模型Seed Diffusion Preview,這款模型主要聚焦于代碼生成領域,它的特別之處在于采用了離散狀態擴散技術,在推理速度上表現出色…

海洋大地測量基準與水下導航系列之九我國海洋PNT最新技術進展(下)

三、海洋PNT技術裝備研發與工程化應用 1.海底基準裝備 研制了首批適應海洋環境的多型海底基準站裝備,在我國南海海域成功布設了定位精度優于0.25m的海底大地測量試驗基準網,實現了我國海底大地測量基準技術零的突破。基準方艙具備穩固、抗壓、防腐、防…

入門MicroPython+ESP32:安裝逗腦IDE及驅動

本篇文章將手把手帶大家入門MicroPython ESP32,重點介紹逗腦IDE的安裝過程以及相關驅動的安裝。 一、下載逗腦IDE 要開始使用逗腦IDE,首先需要從官網下載最新版本。請訪問以下網址進行下載:https://www.itprojects.cn/ide 下載時的界面大…

CentOS上部署Redis及其哨兵(Sentinel)模式

架構:說明我這里是偽集群的,redis 在同一臺機器,Sentinel 只有一個,也存在單點故障問題只能當作開發環境使用,要滿足生產至少是下面這種架構 ------------------- ------------------- ------------------- …

《軟件測試與質量控制》實驗報告二 單元測試

目 錄 一、實驗學時 二、實驗目的 三、實驗環境 (一)硬件環境: (二)軟件環境: 四、實驗內容 1、實驗方案: 2、實驗步驟: 3、設計思路: 1、安裝JUnit和Eclemma…

k8s模式部署PolarDB-X

當前文檔適配PolarDB-X V2.4.0 版本 環境描述: 部署機(ops)1x2.2x.2x8.116,部署機需要可以訪問互聯網。使用ansible進行部署,自行安裝ansible。需要部署兩個k8s集群,分別在其上安裝一個polardb-x集群。 部…

Flask + YARA-Python*實現文件掃描功能

以下是一個 完整的 Web API 示例,使用 Flask YARA-Python 實現文件掃描功能,支持上傳文件并返回 YARA 規則匹配結果。 ? 功能說明 提供一個 /scan 接口,支持文件上傳使用預加載的 YARA 規則進行掃描返回 JSON 格式的匹配結果支持多規則、可…

WinForm之NumericUpDown控件

NumericUpDown(數字上下控件)是 WinForm 中專門用于輸入和調整數值的控件,它結合了文本框和上下按鈕,用戶可通過點擊按鈕或直接輸入來設置數值,且能嚴格限制數值范圍(最小值、最大值)和步長&…

一文讀懂K8S kubectl 命令,運維小白必看!

一、Kubectl 是什么? Kubectl 是 Kubernetes(簡稱 K8S)集群的命令行工具,它就像是一把萬能鑰匙,讓我們可以與 K8S 集群進行交互,輕松管理集群中的各種資源,像是 Pod、Service、Deployment 等等。通過向 K8S API 發送 REST 請求,kubectl 實現了對集群資源的增刪改查等操…

髖臼方向的定義與測量-I

近期看到關于髖臼方向不同應用場景下的不同定義,覺得特別有意思,但是,原文是影印本,不太方便實用屏幕取詞翻譯,且一些專業術語也不太好理解。 因此,我將原文和翻譯整理了一些,不對的地方&#x…

Python爬蟲實戰:研究mahotas庫,構建圖像獲取及處理系統

一、引言 (一)研究背景 在信息爆炸的時代,圖像作為一種直觀、豐富的信息載體,其數量在互聯網上呈現指數級增長。這些圖像數據涵蓋了自然景觀、動植物、工業產品等多個領域,為模式識別、機器學習等研究提供了寶貴的數據源。特別是在植物學研究領域,葉片圖像包含了豐富的…

【04】海康相機C#開發——VS 在編譯時,提示“Files的值“+亂碼情況解決辦法’ ,C#項目打開編譯時報錯:Files 的值“IGEF‘,

文章目錄C#項目打開,用VS 在編譯時編譯時報錯:Files 的值“亂碼; 有的編譯器會顯示:Files的值“IGEF 以上報錯都為同一種錯誤,.net中的配置文件亂碼導致的: 找到項目目錄下的“..\obj\Debug\”的文件夾中…

MySQL隱式轉換陷阱:從錯誤查詢案例解析索引失效與數據類型匹配

開始之前,先問個問題問題:mysql 數據類型是date ,怎么寫查詢條件索引有效? ——下面帶著疑問看下去。 一、mysql-8.隱式轉換導致索引失效或查出不符合where條件結果 今天在執行一條sql語句時候,where條件寫錯了&#x…

【sklearn(01)】數據集加載、劃分,csv文件創建,特征工程,無量綱化

目錄sklearn數據集玩具數據集現實世界數據集加載玩具數據集獲取現實世界數據集本地csv數據創建csv文件pandas加載csv數據集劃分特征工程步驟特征工程APIDictVectorizer 字典列表特征提取APICountVectorizer 文本特征提取API英文文本提取中文文本提取TfidfVectorizer TF-IDF文本…

docker desktop入門(docker桌面版)(提示wsl版本太低解決辦法)

參考文章:Docker Desktop Engine Stopped原因分析(docker桌面停止)WSL沒裝或沒更新 文章目錄Docker Desktop入門指南1. Docker Desktop簡介2. 安裝Docker Desktop2.1 系統要求2.2 下載和安裝3. 配置Docker Desktop修改默認存儲路徑4. 運行你的…