嵌入式自學第二十二天(5.15)

順序表和鏈表?優缺點
存儲方式:
順序表是一段連續的存儲單元
鏈表是邏輯結構連續物理結構(在內存中的表現形式)不連續
時間性能,
查找順序表O(1):下標直接查找
鏈表??O(n):從頭指針往后遍歷才能找到
插入和刪除:
順序表?O(n):需要整體元素移動后插入
鏈表???O(1):只需改指定位置指針指向即可。

空間性能
順序表?需要預先分配空間,大小固定
鏈表,?不需要預先分配,大小可變,動態分配


循環鏈表
簡單的來說,就是將原來單鏈表中最有一個元素的next指針指向第一個元素或頭結點,鏈表就成了一個環,頭尾相連,就成了循環鏈表。circultlar?linker?list。

雙向鏈表:

如圖:每個節點都包含三部分,數據,指向下個節點的指針,指向上個節點的指針。

Makefile:工程管理工具。

預處理、編譯、匯編生產obj、鏈接

a.out:main.c ./doubleLinklist.c

????????gcc main.c doubleLinklist.c

Clean:

????????rm a.out.

保存后按make命令默認走第一條規則生成a.out

按make clean清除a.out

#代表源文件

SRC += main.c

SRC +=doulink.c

DST = app

CC = gcc

FLAG = -g

LIB=-lm

$(DST):$(SRC)

????????$(CC) ?$(SRC) $(FLAG) $(LIB) -o $(DST)

clean

????????rm $(DST)

指定文件:make -f makefile2

今天寫了雙向鏈表相關操作的函數:

#include "doulink.h"

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

struct DouLinkList* CreateDouLinkList()//創建雙向鏈表

{

????struct DouLinkList* dl = (struct DouLinkList*) malloc(sizeof(struct DouLinkList));

????if(NULL == dl)

????{

????????fprintf(stderr,"CreateDouLinkList malloc\n");

????????return NULL;

????}

????dl->head = NULL;

????dl->clen = 0;

????return dl;

}

int InsertHeadDouLinkList(struct DouLinkList* dl, struct DATATYPE* data)//雙向鏈表頭查

{

????struct DouNode * newnode = ??(struct DouNode*)malloc(sizeof(struct DouNode));

????if(NULL == newnode)

????{

????????fprintf(stderr,"inserthead malloc\n");

????????return 1;

????}

????memcpy(&newnode->data,data,sizeof(struct DATATYPE));

????newnode->next = NULL;

????newnode->prev = NULL;

????newnode->next = dl->head;

????if(dl->head)

????{

????????dl->head->prev = newnode;

????}

????dl->head ?= newnode;

????dl->clen++;

????return 0;

}

int ShowDouLinkList(struct DouLinkList* dl,DIR dir)//雙向鏈表遍歷

{

????struct DouNode* tmp = dl->head;

????if( FORWADR==dir)

????{

????????while(tmp)

????????{

????????????printf("%s %c %d %d\n",tmp->data.name,tmp->data.sex,tmp->data.age,tmp->data.score);

????????????tmp=tmp->next;

????????}

????}

????else if(BACKWADR == dir)

????{

????????while(tmp->next)

????????{

????????????tmp=tmp->next;

????????} // end node

????????while(tmp)

????????{

????????????printf("%s %c %d %d\n",tmp->data.name,tmp->data.sex,tmp->data.age,tmp->data.score);

????????????tmp=tmp->prev;

????????}

????}

????return 0;

}

int InsertTailDouLinkList(struct DouLinkList*dl,struct DATATYPE*data)//雙向鏈表尾插

{

????if(IsEmptyDouLinkList(dl))

????{

????????return InsertHeadDouLinkList(dl,data);

????}

????else ?

????{

????????struct DouNode* tmp = dl->head ;

????????while(tmp->next)

????????{

????????????tmp= tmp->next;

????????}

????????struct DouNode* newnode = (struct DouNode*)malloc(sizeof(struct DouNode));

????????if(NULL == newnode)

????????{

????????????fprintf(stderr,"InsertTailDouLinkList malloc\n");

????????????return 1;

????????}

????????//初始化節點

????????memcpy(&newnode->data,data,sizeof(struct DATATYPE));

????????newnode->next ?= NULL;

????????newnode->prev = NULL;

???????// 連接鏈表

????????newnode->prev ?= tmp;

????????tmp->next ?= newnode;

????????dl->clen++;

????}

????return 0;

}

int InsertPosDouLinkList(struct DouLinkList*dl,struct DATATYPE*data,int pos)//雙向鏈表指定位置插入元素

{

????int len = GetSizeDouLinkList(dl);

????

????if(pos<0 || pos>len)

????{

????????return 1;

????}

????if(0 == pos)

????{

????????return InsertHeadDouLinkList(dl,data);

????}

????else if(pos == len)

????{

????????return InsertTailDouLinkList(dl,data);

????}

????else

????{

????????struct DouNode* tmp = dl->head;

????????int i = 0 ;

????????for(i = 0 ;i<pos;++i)

????????{

????????????tmp=tmp->next;

????????}

????????struct DouNode* newnode = (struct DouNode*)malloc(sizeof(struct DouNode));

????????if(NULL == newnode)

????????{

????????????fprintf(stderr,"InsertposDouLinkList malloc\n");

????????????return 1;

????????}

????????memcpy(&newnode->data , data,sizeof(struct DATATYPE));

????????newnode->next ?= NULL;

????????newnode->prev ?= NULL;

????????newnode->next ?= tmp;

????????newnode->prev ?= tmp->prev;

????????tmp->prev = newnode;

????????newnode->prev->next ?= newnode;

????????dl->clen++;

????}

????return 0;

}

int IsEmptyDouLinkList(struct DouLinkList*dl)//雙向鏈表是否為空

{

????return 0 == dl->clen;

}

int GetSizeDouLinkList(struct DouLinkList*dl)//雙向鏈表長度獲取

{

????return dl->clen;

}

struct DouNode* FindDouLinkList(struct DouLinkList* dl,char *name)//查找元素

{

????if(IsEmptyDouLinkList(dl))

????{

????????return NULL;

????}

????struct DouNode* tmp = dl->head;

????int len = GetSizeDouLinkList(dl);

????int i = 0 ;

????for(i = 0 ;i< len; ++i)

????{

????????if(0 == strcmp(tmp->data.name,name))

????????{

????????????return tmp;

????????}

????????tmp= tmp->next;

????}

????return NULL;

}

int ModifyDouLinkList(struct DouLinkList* dl,char *name,struct DATATYPE* data)//修改元素

{

????struct DouNode* ret = FindDouLinkList(dl,name);

????if(NULL == ret)

????{

????????return 1;

????}

????memcpy(&ret->data,data,sizeof(struct DATATYPE));

????return 0;

}

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

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

相關文章

高并發內存池(三):TLS無鎖訪問以及Central Cache結構設計

目錄 前言&#xff1a; 一&#xff0c;thread cache線程局部存儲的實現 問題引入 概念說明 基本使用 thread cache TLS的實現 二&#xff0c;Central Cache整體的結構框架 大致結構 span結構 span結構的實現 三&#xff0c;Central Cache大致結構的實現 單例模式 thr…

Ubuntu 安裝 Docker(鏡像加速)完整教程

Docker 是一款開源的應用容器引擎&#xff0c;允許開發者打包應用及其依賴包到一個輕量級、可移植的容器中。本文將介紹在 Ubuntu 系統上安裝 Docker 的步驟。 1. 更新軟件源 首先&#xff0c;更新 Ubuntu 系統的軟件源&#xff1a; sudo apt update2. 安裝基本軟件 接下來…

【深度學習】數據集的劃分比例到底是選擇811還是712?

1 引入 在機器學習中&#xff0c;將數據集劃分為訓練集&#xff08;Training Set&#xff09;、驗證集&#xff08;Validation Set&#xff09;和測試集&#xff08;Test Set&#xff09;是非常標準的步驟。這三個集合各有其用途&#xff1a; 訓練集 (Training Set)&#xff…

Mysql刷題 day01

LC 197 上升的溫度 需求&#xff1a;編寫解決方案&#xff0c;找出與之前&#xff08;昨天的&#xff09;日期相比溫度更高的所有日期的 id 。 代碼&#xff1a; select w2.id from Weather as w1 join Weather as w2 on DateDiff(w2.recordDate , w1.recordDate) 1 where…

鴻蒙OSUniApp 制作個人信息編輯界面與頭像上傳功能#三方框架 #Uniapp

UniApp 制作個人信息編輯界面與頭像上傳功能 前言 最近在做一個社交類小程序時&#xff0c;遇到了需要實現用戶資料編輯和頭像上傳的需求。這個功能看似簡單&#xff0c;但要做好用戶體驗和兼容多端&#xff0c;還是有不少細節需要處理。經過一番摸索&#xff0c;總結出了一套…

科技的成就(六十八)

623、杰文斯悖論 杰文斯悖論是1865年經濟學家威廉斯坦利杰文斯提出的一悖論&#xff1a;當技術進步提高了效率&#xff0c;資源消耗不僅沒有減少&#xff0c;反而激增。例如&#xff0c;瓦特改良的蒸汽機讓煤炭燃燒更加高效&#xff0c;但結果卻是煤炭需求飆升。 624、代碼混…

榮耀手機,系統MagicOS 9.0 USB配置沒有音頻來源后無法被adb檢測到,無法真機調試的解決辦法

榮耀手機&#xff0c;系統MagicOS 9.0 USB配置沒有音頻來源后無法被adb檢測到&#xff0c;無法真機調試的解決辦法 前言環境說明操作方法 前言 一直在使用的uni-app真機運行榮耀手機方法&#xff0c;都是通過設置USB配置的音頻來源才能成功。突然&#xff0c;因為我的手機的系…

D-Pointer(Pimpl)設計模式(指向實現的指針)

Qt 的 D-Pointer&#xff08;Pimpl&#xff09;設計模式 1. Pimpl 模式簡介 Pimpl&#xff08;Pointer to Implementation&#xff09;是一種設計模式&#xff0c;用于將類的接口與實現分離&#xff0c;從而隱藏實現細節&#xff0c;降低編譯依賴&#xff0c;提高代碼的可維護…

MySQL 8.0 OCP 1Z0-908 101-110題

Q101.which two queries are examples of successful SQL injection attacks? A.SELECT id, name FROM backup_before WHERE name‘; DROP TABLE injection; --’; B. SELECT id, name FROM user WHERE id23 oR id32 OR 11; C. SELECT id, name FROM user WHERE user.id (SEL…

Vue ElementUI原生upload修改字體大小和區域寬度

Vue ElementUI原生upload修改字體大小和區域寬度 修改后 代碼 新增的修改樣式代碼 .upload-demo /deep/ .el-upload-dragger{width: 700px;height: 300px; }原有拖拽組件代碼 <!-- 拖拽上傳組件 --><el-uploadclass"upload-demo"dragaction"":m…

React和Vue在前端開發中, 通常選擇哪一個

React和Vue的選擇需結合具體需求&#xff1a; 選React的場景 大型企業級應用&#xff0c;需處理復雜狀態&#xff08;如電商、社交平臺&#xff09;團隊熟悉JavaScript&#xff0c;已有React技術棧積累需要高度靈活的架構&#xff08;React僅專注視圖層&#xff0c;可自由搭配…

Python爬蟲實戰:研究源碼還原技術,實現逆向解密

1. 引言 在網絡爬蟲技術實際應用中,目標網站常采用各種加密手段保護數據傳輸和業務邏輯。傳統逆向解密方法依賴人工分析和調試,效率低下且易出錯。隨著 Web 應用復雜度提升,特別是 JavaScript 混淆技術廣泛應用,傳統方法面臨更大挑戰。 本文提出基于源碼還原的逆向解密方法…

什么是alpaca 或 sharegpt 格式的數據集?

環境&#xff1a; LLaMA-Factory 問題描述&#xff1a; alpaca 或 sharegpt 格式的數據集&#xff1f; 解決方案&#xff1a; “Alpaca”和“ShareGPT”格式的數據集&#xff0c;是近年來在開源大語言模型微調和對話數據構建領域比較流行的兩種格式。它們主要用于訓練和微調…

OpenCV CUDA模塊中矩陣操作------矩陣元素求和

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 在OpenCV的CUDA模塊中&#xff0c;矩陣元素求和類函數主要用于計算矩陣元素的總和、絕對值之和以及平方和。這些操作對于圖像處理中的特征提取、…

給視頻加一個動畫。

為什么要給視頻加一個動畫&#xff1f; 很完整的視頻也就是從短動畫開始的。遮蓋住LOG用。 C:\Users\Sam\Desktop\desktop\startup\workpython\ocr Lottie.py import subprocessdef run_ffmpeg(cmd):print("Running:", " ".join(cmd))subprocess.run(cm…

15:00開始面試,15:06就出來了,問的問題有點變態。。。

從小廠出來&#xff0c;沒想到在另一家公司又寄了。 到這家公司開始上班&#xff0c;加班是每天必不可少的&#xff0c;看在錢給的比較多的份上&#xff0c;就不太計較了。沒想到4月一紙通知&#xff0c;所有人不準加班&#xff0c;加班費不僅沒有了&#xff0c;薪資還要降40%…

使用命令行拉取 Git 倉庫

1. 克隆遠程倉庫&#xff08;首次獲取&#xff09; # 克隆倉庫到當前目錄&#xff08;默認使用 HTTPS 協議&#xff09; git clone https://github.com/用戶名/倉庫名.git# 克隆倉庫到指定目錄 git clone https://github.com/用戶名/倉庫名.git 自定義目錄名# 使用 SSH 協議克隆…

如何禁止chrome自動更新

百度了一下 下面這個方法實測有效 目錄 1、WINR 輸入 services.msc 2、在Services彈窗中找到下面兩個service并disable 3、驗證是否禁止更新成功&#xff1a; 1、WINR 輸入 services.msc 2、在Services彈窗中找到下面兩個service并disable GoogleUpdater InternalService…

數據庫事務以及JDBC實現事務

一、數據庫事務 數據庫事務&#xff08;Database Transaction&#xff09;是數據庫管理系統中的一個核心概念&#xff0c;它代表一組操作的集合&#xff0c;這些操作要么全部執行成功&#xff0c;要么全部不執行&#xff0c;即操作數據的最小執行單元&#xff0c;保證數據庫的…

【vue】【環境配置】項目無法npm run serve,顯示node版本過低

解決方案&#xff1a;安裝高版本node&#xff0c;并且啟用高版本node 步驟&#xff1a; 1、查看當前版本 node -v2、配置nvm下載鏡像源 1&#xff09;查看配置文件位置 npm root2&#xff09;找到settings.txt文件 修改鏡像源為&#xff1a; node_mirror: https://npmmirro…