玳瑁的嵌入式日記D21-08020(數據結構)

雙向鏈表


double?link?list

typedef struct dou_node {
DATATYPE data;
struct dou_node *prev;
struct dou_node *next;
}DouLinkNode;


雙向鏈表:

節點? =? 數據?+?NEXT?+PREV?.
手撕代碼(增加+刪除)
增加,刪除的操作,?需要 tmp?停止待操作節點的前一節點上。
查找操作進行了擴展,回調函數(函數指針)。解耦合,擴展功能。


查找? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?順序表O(1)? ? ? ? ?鏈表??O(n)
插入和刪除? ? ? ? ? ? ? ? ? ? ?順序表?O(n)? ? ? ?鏈表???O(1)

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


int InsertHeadDouLinkList(DouLinkList *list,DATATYPE *data)
{
DouLinkNode *newnode = (DouLinkNode*)malloc(sizeof(DouLinkNode));
if ( NULL == newnode )
{
perror( "IsertHeadDouLinkList malloc error" );
return 1;
}
? memcpy(&newnode->data,data,sizeof(DATATYPE));
newnode->prev = NULL;
newnode->next = NULL;
if ( IsEmptyLinkList(list) )
{
list->head = newnode;
}
else{
newnode->next = list->head;
? list->head->prev = newnode;
list->head = newnode;
}
list->clen++;
return 0;
}

int InsertTailDouLinkList(DouLinkList *dl, DATATYPE *data)
{
if (IsEmptyLinkList(dl))
{
return InsertHeadDouLinkList(dl, data);
}
else
{
DouLinkNode *newnode = malloc(sizeof(DouLinkNode));
if (NULL == newnode)
{
perror("InsertTailDouLinkList malloc");
return 1;
}
memcpy(&newnode->data, data, sizeof(DATATYPE));
newnode->next = NULL;
newnode->prev = NULL;

? ? DouLinkNode *tmp = dl->head;
while (tmp->next)
{
tmp = tmp->next;
}

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

}
dl->clen++;
return 0;
}

int InsertPosLinkList(DouLinkList *list, DATATYPE *data,int pos)
{
if(pos<0 || pos > list->clen)
{
printf("InsertPosLinkList pos error\n");
return 1;
}

? ? if(pos == 0)
{
return InsertHeadDouLinkList(list,data);
}
else if(pos == list->clen)
{
return InsertTailDouLinkList(list, data);
}else
{

? ? DouLinkNode *newnode = malloc(sizeof(DouLinkNode));
if(NULL == newnode)
{
perror("InsertPosLinkList malloc error");
return 1;
}
memcpy(&newnode->data,data,sizeof(DATATYPE));
newnode->next = NULL;
newnode->prev = NULL;
DouLinkNode *tmp = list->head;
for(int i = 0; i < pos; i++)
{
tmp = tmp->next;
}

? ? newnode->next = tmp;
newnode->prev = tmp->prev;
tmp->prev->next = newnode;
tmp->prev = newnode;
list->clen++;

? ? }
return 0;
}


gdb



typedef enum {DIR_FORWARD,DIR_BACKWARD}DIRECT;? ? //枚舉

int ShowLinkList(DouLinkList *list,DIRECT direct)??
{
DouLinkNode *tmp = list->head;
if(DIR_FORWARD == direct)
{
while(tmp)
{
printf("%s \n",tmp->data.data);
tmp = tmp->next;
}

? ? }else
{
while(tmp->next)
{
tmp = tmp->next;
}? // 移到最后
while(tmp)
{
printf("%s \n",tmp->data.data);
tmp = tmp->prev;
} ? ? ?
}

return 0;
}


int ReviseLinkList(DouLinkList *list)
{
if(list == NULL|| list->clen == 0)
{
printf("RviseLinkList error");
return 1;
}
DouLinkNode *prev = NULL;
DouLinkNode *curr = list->head;
DouLinkNode *next = NULL;


while(curr!=NULL)
{
? next = curr->next;
prev = curr->prev;

curr->next = prev; //后移
prev = curr;
curr = next;
}
list->head = prev;
return 0;
}


DouLinkNode *FindDouLinkList(DouLinkList *dl,PFUN fun, void*arg);

DouLinkNode *FindDouLinkList(DouLinkList *dl,PFUN fun, void*arg)
{
DouLinkNode* tmp = dl->head;
while(tmp)
{
// if(0==strcmp(tmp->data.name,name))
if ( fun ( &tmp->data , arg))
{
return tmp;
}
tmp=tmp->next;
}
return NULL;
}

int findperbyname(DATATYPE*data,void* arg)
{
// 從void* -> 其他類型指針,需要強轉
return 0 == strcmp(data->name,(char*)arg);
}

int findperbyage(DATATYPE*data,void* arg)
{
// 從void* -> 其他類型指針,需要強轉
return data->age == *(int*)arg;;
}


? ?printf("------------------------find-----------------------------\n");
char want_name[] = "lisi";
int age =50;
DouLinkNode* tmp = FindDouLinkList(list,findperbyname ,want_name);
if (NULL == tmp)
{
printf("cant find per %s\n",want_name);
}
else
{
printf("find it,name:%s score:%d\n",tmp->data.name,tmp->data.score);
}

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

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

相關文章

Uipath查找元素 查找子元素 獲取屬性活動組合使用示例

Uipath 查找元素 查找子元素 獲取屬性組合使用示例使用場景案例介紹項目流程圖附加瀏覽器查找元素查找子元素遍歷循環獲取屬性點擊元素使用場景 在實際場景中&#xff0c;有時需RPA自動點擊某組范圍元素或獲取某組范圍元素的值&#xff0c;如需獲取指定的父元素&#xff0c;再…

【MongoDB與MySQL對比】

MongoDB 與 MySQL 全方位對比分析在現代軟件開發中&#xff0c;數據庫的選擇直接影響系統性能、擴展性和開發效率。MongoDB 和 MySQL 作為兩種主流數據庫&#xff0c;分別代表了 NoSQL 和關系型數據庫的典型&#xff0c;各自在不同場景中發揮著重要作用。本文將拋開代碼示例&am…

Spring AI開發指導-對話模型

對話模型接口描述Spring AI基于Spring Cloud的架構體系&#xff0c;定義了一系列可擴展的API接口&#xff0c;支持對接不同類型的AI大模型的核心功能&#xff0c;這些API接口支持同步編程模式或者異步編程模式&#xff1a;接口ModelModel是同步編程模式接口&#xff0c;其參數支…

Win11 下卸載 Oracle11g

目錄 1、停止服務 2、啟動 Universal install 應用 3、執行 deinstall.bat 腳本 4、刪除注冊表相關數據 5、刪除環境變量中的oracle相關路徑 6、刪除安裝文件 7、刪除C盤中的相關Oracle文件 8、刪除 Oracle 數據存放目錄 9、檢查 10、重裝oracle可能還會碰到的問題 &…

深入剖析Spring Boot應用啟動全流程

目錄 前言 啟動流程概覽 一、第一階段&#xff1a;初始化SpringApplication 二、第二階段&#xff1a;運行SpringApplication 三、第三階段&#xff1a;環境準備 四、第四階段&#xff1a;創建應用上下文 五、第五階段&#xff1a;準備應用上下文 六、第六階段&#xf…

Matplotlib 可視化大師系列(三):plt.bar() 與 plt.barh() - 清晰對比的柱狀圖

目錄Matplotlib 可視化大師系列博客總覽Matplotlib 可視化大師系列&#xff08;三&#xff09;&#xff1a;plt.bar() 與 plt.barh() - 清晰對比的柱狀圖一、 柱狀圖是什么&#xff1f;何時使用&#xff1f;二、 函數原型與核心參數plt.bar(x, height, ...) - 垂直柱狀圖plt.ba…

基于 FastAPI 和 OpenFeature 使用 Feature Flag 控制業務功能

模擬業務場景&#xff1a;多租戶系統跨域轉賬&#xff0c;需要控制某租戶下某用戶是否可以在某域轉賬 open_feature_util.py import typing from abc import abstractmethod, ABCMeta from typing import Sequencefrom openfeature.evaluation_context import EvaluationContex…

Stm32通過ESP8266 WiFi連接阿里云平臺

本文將介紹stm32如何通過WiFi來連接阿里云&#xff0c;上傳數據和接收指令。要先與阿里云建立TCP連接&#xff0c;然后再通過MQTT協議交互。 大體流程&#xff1a;1、在阿里云網頁上創建產品和設備&#xff1b;2、stm32通過WiFi連接云平臺&#xff1b;3、MQTT連接阿里云&#…

北京-測試-入職甲方金融-上班第三天

今日上班時間9-20.18&#xff0c;再加42分鐘就可以拿到75塊錢了&#xff0c;但我想回家&#xff0c;所以下班今天上午有人事舉辦的入職培訓&#xff0c;下午有業務培訓&#xff0c;培訓完領導給我安排了兩個需求。慌死&#xff0c;嚇死&#xff0c;我都不懂&#xff0c;業務和工…

Java基礎第2天總結

使用switch時注意事項&#xff1a;表達式類型只能是byte、short、int、char,JDK5開始支持枚舉&#xff0c;JDK7開始支持String&#xff0c;不支持double、float、long(精確度問題&#xff0c;小數有點不精確)。case給出的值不允許重復&#xff0c;且只能是字面量&#xff0c;不…

鴻蒙開發中的List組件詳解

目錄 引言 1.List組件基礎 2.List接口參數 1.space 2.initialIndex 3.scroller 3.ListView的屬性 1.listDirection 2.lanes 3.divider 4.scrollBar 4.布局與約束 5.ListItem生命周期 1.使用ForEach創建ListItem 2.使用LazyForEach創建ListItem 3…

2026界計算機專業畢業的有福了!(開題報告任務書)

開題報告 我們以基于Java的婚紗店管理系統為案例進行指導。 任務書&#xff1a; 首先是畢設的立題依據&#xff0c;這個主要描寫一些簡潔大體的大白話&#xff0c;描述一下你為什么要做這個題目的畢設。 那就需要你描述一下現階段社會面婚紗店的運營情況&#xff0c;寫一些…

安全、高效、可靠的物理隔離網絡安全專用設備———信刻光盤安全隔離與文件單向導入系統!

著各種數據傳輸、儲存技術、信息技術的快速發展&#xff0c;保護信息安全是重中之重。軍工企業、政府、部隊及企事業單位等利用A網與B網開展導入/導出相關工作已成為不可逆轉的趨勢。針對于業務需要與保密規范相關要求&#xff0c;涉及重要秘密信息&#xff0c;需做到完全的物理…

JetPack 與 PyTorch 版本對應及資源詳情

下載鏈接 JetPack 版本適配 PyTorch 版本發布日期可下載資源&#xff08;.whl 安裝包 / 文檔&#xff09;JP 6.1PyTorch 2.5.0a0&#xff08;構建號&#xff1a;872d972e41.nv24.08.17622132&#xff09;2024/10/01- torch-2.5.0a0872d972e41.nv24.08.17622132-cp310-cp310-li…

【c++進階系列】:萬字詳解多態

&#x1f525; 本文專欄&#xff1a;c &#x1f338;作者主頁&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客勵志語錄&#xff1a; 你以為自己在孤獨地爬坡嗎&#xff1f;看看身后吧——那些被汗水浸濕的腳印&#xff0c;早已連成一道向上的階梯 ★★★ 本文前置知識&am…

AI+預測3D新模型百十個定位預測+膽碼預測+去和尾2025年8月23日第168彈

從今天開始&#xff0c;咱們還是暫時基于舊的模型進行預測&#xff0c;好了&#xff0c;廢話不多說&#xff0c;按照老辦法&#xff0c;重點8-9碼定位&#xff0c;配合三膽下1或下2&#xff0c;殺1-2個和尾&#xff0c;再殺4-5個和值&#xff0c;可以做到100-300注左右。(1)定位…

分布式搜索(Elasticsearch)深入用法

目錄 數據聚合 聚合的種類 DSL實現聚合 桶聚合 度量聚合 RestAPI實現聚合 多條件聚合 自動補全 拼音分詞器 自定義分詞器 自動補全查詢 實現搜索框自動補全 數據同步 數據同步思路分析 實現elasticsearch與數據庫數據同步 集群 搭建ES集群 集群腦裂問題 集群…

java:接口與實現類

1. Java 基礎層面接口&#xff08;Interface&#xff09; 只是方法的定義/規范&#xff0c;里面沒有真正的邏輯。例如&#xff1a;public interface IBookService {boolean save(Book book); }&#x1f449; 這里只說明了&#xff1a;我要有一個 save 方法&#xff0c;但“怎么…

Chrome 插件開發實戰:從入門到進階

1.1 Chrome 插件的魅力與應用場景Chrome 插件是增強 Chrome 瀏覽器功能的得力助手&#xff0c;能實現廣告攔截、密碼管理、標簽管理等實用功能。在日常辦公中&#xff0c;我們可以借助插件提升效率&#xff0c;如自動填充表單、快速保存網頁內容&#xff1b;在瀏覽網頁時&#…

通過官方文檔詳解Ultralytics YOLO 開源工程-熟練使用 YOLO11實現分割、分類、旋轉框檢測和姿勢估計(附測試代碼)

目錄 前言&#xff1a; 1.了解ultralytics工程與yolo模型 1.1 yolo11可以為我們做些什 1.2 yolo11模型的高性能 1.3 對于yolo11一些常見的問題 1.3.1 YOLO11 如何以更少的參數實現更高的精度&#xff1f; 1.3.2 YOLO11 可以部署在邊緣設備上嗎&#xff1f; 2. 深入了解y…