Linux學習—數據結構(鏈表2)

1.單向鏈表

6.鏈表的查找

在鏈表中找到指定的第一個元素

  • 沿用遍歷思想,每次訪問一個節點元素判斷是否為要找的節點
  • 符合條件返回該節點地址
  • 到最后沒有找到符號條件的節NULL
linknode *find_linklist(linknode *phead, datatype tmpdata)
{linknode *ptmpnode = NULL;ptmpnode = phead->pnext;while(ptmpnode != NULL){if(ptmpnode->data == tmpdata){return ptmpnode;}else{ptmpnode = ptmpnode->pnext;}}return NULL;
}

7.鏈表的修改

沿用遍歷思想,找到需要修改的節點

/*更換鏈表老元素為新元素*/
int update_linklist(linknode *phead, datatype olddata, datatype newdata)
{linknode *ptmpnode = phead->pnext;while(ptmpnode != NULL){if(ptmpnode->data == olddata){ptmpnode->data = newdata;ptmpnode = ptmpnode->pnext;}else{ ptmpnode = ptmpnode->pnext;   }}return 0;
}

8.尾插法

在鏈表結尾插入一個元素

  • 申請節點空間
  • 將數據存放到節點中
  • 將節點中地址賦值為NULL
  • 找到最后一個節點
  • 最后一個節點的pnext賦值為新申請節點
int insert_tail_linklist(linknode *phead, datatype tmpdata)
{linknode *ptmpnode = NULL;linknode *pnewnode = NULL;ptmpnode = phead;       //從空白節點開始找pnewnode = malloc(sizeof(linknode));if(NULL == pnewnode){perror("fail to malloc");return -1;}while(ptmpnode->pnext != NULL){ptmpnode = ptmpnode->pnext;}pnewnode->data = tmpdata;pnewnode->pnext = NULL;ptmpnode->pnext = pnewnode;return 0;
}

?9.鏈表的銷毀

  • 定義兩個指針pfreenode和ptmpnode都指向頭結點
  • ptmpnode向后走
  • 再釋放pfreenode指向的節點
  • 再將pfreenode指向ptmpnode指向的空間
void destroy_linklist(linknode **pphead)
{linknode *ptmpnode = NULL;linknode *pfreenode = NULL;pfreenode = *pphead;ptmpnode = *pphead;while(ptmpnode != NULL){ptmpnode = ptmpnode->pnext;free(pfreenode);pfreenode = ptmpnode;}*pphead = NULL;return;
}

10.查找鏈表的中間節點

  • 快指針每次走2步,慢指針每次走1步
  • 快指針走到末尾,慢指針走到中間
linknode *find_midnode(linknode *phead)
{linknode *pfast = NULL;linknode *pslow = NULL;pfast = pslow = phead->pnext;while(pfast != NULL){pfast = pfast->pnext;if(pfast == NULL){break;}        pfast = pfast->pnext;if(pfast == NULL){break;}pslow = pslow->pnext;}return pslow;
}

11.查找鏈表倒數第k個節點

  • 快指針先走k步
  • 慢指針和快指針每次走一步
  • 快指針到達末尾,慢指針少走k步,即倒數第k個元素
/*查找鏈表倒數第k個節點*/
linknode *find_last_kth_node(linknode *phead, int k)
{int i = 0;linknode *pfast = NULL;linknode *pslow = NULL;pfast = phead->pnext;pslow = phead->pnext;for(i = 0; i < k && pfast != NULL; i++){pfast = pfast->pnext;}if(pfast == NULL){return NULL;}while(pfast != NULL){pfast = pfast->pnext;pslow = pslow->pnext;}return pslow;
}

12.不知道頭節點地址,如何刪除鏈表中間節點

  • 將指針指向的下一個節點的值覆蓋當前節點的值
  • 刪除下一個節點
void delete_linknode(linknode *ptmpnode)
{linknode *pnextnode = NULL;pnextnode = ptmpnode->pnext;ptmpnode->data = pnextnode->data;ptmpnode->pnext = pnextnode->pnext;free(pnextnode);return;
}

13.鏈表的倒置

將鏈表所以元素倒置

  • 將原鏈表斷開
  • 將所有的元素依次使用頭插法插入
void reverse_linklist(linknode *phead)
{linknode *ptmpnode = NULL;linknode *pinsertnode = NULL;//將鏈表從頭結點斷開ptmpnode = phead->pnext;phead->pnext = NULL;//依次將所有元素使用頭插法插入鏈表while(ptmpnode != NULL){pinsertnode = ptmpnode;ptmpnode = ptmpnode->pnext;pinsertnode->pnext = phead->pnext;phead->pnext = pinsertnode;}return;
}

14.鏈表的排序

冒號排序

  • 采用冒號排序思想,定義兩個指針,相鄰兩個元素比較
  • 指針循環向后走,直到ptmnode2為NULL,即等于pend,循環停止
  • pend賦值為ptmpnode1的節點地址
  • 下一輪就可以少比一次
void bubble_sort_linklist(linknode *phead)
{linknode *ptmpnode1 = NULL;linknode *ptmpnode2 = NULL;linknode *pend = NULL;datatype tmpdata;if(NULL == phead->pnext || NULL == phead->pnext->pnext){return;}while(1){ptmpnode1 = phead->pnext;ptmpnode2 = phead->pnext->pnext;if(ptmpnode2 == pend){break;}while(ptmpnode2 != pend){if(ptmpnode1->data > ptmpnode2->data){tmpdata = ptmpnode1->data;ptmpnode1->data = ptmpnode2->data;ptmpnode2->data = tmpdata;}ptmpnode1 = ptmpnode1->pnext;ptmpnode2 = ptmpnode2->pnext;}pend = ptmpnode1;}return;
}

選擇排序

  • pswapnode指向要交換的節點
  • pminnode假設的最小值
  • ptmpnode和后續節點比較
void select_sort_linklist(linknode *phead)
{linknode *pminnode = NULL;linknode *pswapnode = NULL;linknode *ptmpnode = NULL;datatype tmpdata;if(NULL == phead->pnext || NULL == phead->pnext->pnext){return;}pswapnode = phead->pnext;while(pswapnode->pnext != NULL){pminnode = pswapnode;ptmpnode = pswapnode->pnext;while(ptmpnode != NULL){if(ptmpnode->data < pminnode->data){pminnode = ptmpnode;}ptmpnode = ptmpnode->pnext;}if(pminnode != pswapnode){tmpdata = pminnode->data;pminnode->data = pswapnode->data;pswapnode->data = tmpdata;}pswapnode = pswapnode->pnext;}return;
}

15.判斷鏈表是否有環

  • 判斷鏈表是否有環
  • 計算環長
  • 找到環的入口位置

判斷是否有環

  • 定義兩個指針:快指針(每次2步)和慢指針(每次走1步)
  • 快指針-慢指針 == 環長即相遇, 快指針和慢指針相等即為鏈表有環

計算環長

  • 定義一個指針從環相遇開始走一圈,知道走到該節點為止
  • 每走一個節點計數,最終得到環長

獲得環的入口位置

  • 定義一個指針,從相遇點開始每次走一步,定義一個指針,從開頭每次走一步
  • 兩個指針相遇即為環入口

2.雙向鏈表

1.創建空鏈表

參考單向鏈表的創建

linknode *creat_empty_linlist(void)
{linknode *ptmpnode = NULL;ptmpnode = malloc(sizeof(linknode));if(NULL == ptmpnode){perror("fail to malloc");return NULL;}ptmpnode->pnext = NULL;ptmpnode->ppre = NULL;return ptmpnode;
}

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

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

相關文章

MySQL 備份利器 Xtrabackup 全解析:從部署到恢復的實戰指南

數據庫備份恢復是 DBA 的 “保命” 技能&#xff0c;生產業務不僅要保證有合適的備份策略&#xff0c;也要定期驗證備份的有效性和恢復演練流程&#xff0c;因為數據恢復和驗證可能會涉及多方合作&#xff0c;演練可以讓災難真正發生時&#xff0c;多方配合有條不紊的將數據恢復…

EAGLE-2:通過動態草稿樹加速語言模型推理

溫馨提示&#xff1a; 本篇文章已同步至"AI專題精講" EAGLE-2&#xff1a;通過動態草稿樹加速語言模型推理 摘要 現代 Large Language Models&#xff08;LLMs&#xff09;的推理過程既昂貴又耗時&#xff0c;而 speculative sampling 已被證明是一種有效的解決方案…

防水防塵防摔性能很好的智能三防手機,還有22000mAh大電池

在電力巡檢的崇山峻嶺間&#xff0c;在野外地質勘探的風沙深處&#xff0c;在應急救援的急風驟雨里&#xff0c;傳統智能設備因其固有的脆弱性與續航短板往往力不從心&#xff0c;甚至成為保障工作連續性的掣肘。而真正的智能三防手機應是一堵移動的堡壘&#xff0c;集堅不可摧…

Charles中文版抓包工具使用指南 提高API調試和網絡優化效率

在現代開發過程中&#xff0c;調試API、捕獲HTTP/HTTPS流量和優化應用的網絡性能已經成為開發者的常見任務。尤其是在調試復雜的API接口和分析網絡請求時&#xff0c;開發者需要一款高效且功能強大的工具。Charles抓包工具憑借其強大的網絡調試功能和易用的操作界面&#xff0c…

【C#補全計劃:類和對象(九)】接口

一、接口的概念1. 概念&#xff1a;接口是行為的抽象規范&#xff0c;也是一種自定義類型2. 接口聲明規范&#xff1a;&#xff08;1&#xff09;不包含成員變量&#xff08;2&#xff09;只包含屬性、方法、索引器、事件&#xff08;3&#xff09;成員不能被實現&#xff08;4…

SRS簡介及簡單demo

SRS介紹 SRS(Simple Realtimes Server)是一款開源的實時流媒體服務器,專注于解決直播、實時互動等場景的流媒體傳輸問題。SRS 的設計目標是 “簡單、穩定、高效”,專門針對實時流媒體協議(如 RTMP、HLS、HTTP-FLV、WebRTC 等)進行優化,專注于解決 “低延遲、高并發” 的…

python基礎:數據解析BeatuifulSoup,不需要考慮前端形式的一種獲取元素的方法

1.beatuifulSoup 基本用法 beautifulSoup&#xff08;簡稱bs4&#xff09;是python的一個第三方庫&#xff0c;用于解析html和xml文檔中提取數據的python庫。它能夠將復雜的文檔轉化為樹形結構&#xff0c;方便快速定位和提取所需數據以及查找和修改&#xff0c;常常與爬蟲框架…

Ubuntu共享文件夾權限設置

在Ubuntu中設置共享文件夾的權限&#xff08;只讀、讀寫、無權限&#xff09;&#xff0c;主要通過兩種方式實現&#xff1a;?文件系統權限?和?Samba共享配置?。以下是詳細步驟&#xff1a;?一、文件系統權限設置&#xff08;基礎權限&#xff09;?1. ?修改文件夾所有權…

小程序點擊菜單欄實現樣式動態切換

小程序點擊菜單欄背景樣式動態切換 前言&#xff1a;今天做一個小程序項目&#xff0c;要做一個菜單欄動態切換的功能&#xff0c;因為這種需求很常見&#xff0c;這次干脆記錄一下&#xff0c;幫助別人的同時&#xff0c;自己下次也可以直接照搬使用。 效果截圖如下&#xff1…

掌握工程化固件燒錄,開啟你的技術進階之路-FPGA ISE(xilinx)

1、電腦需先行安裝ISE14.7。若已完成安裝&#xff0c;此步驟可略過&#xff1b;若尚未安裝&#xff0c;在后續章節會介紹如何安裝ISE&#xff0c;由于ISE14.7的安裝程序體量龐大&#xff0c;可借助U盤進行傳輸。同時&#xff0c;電腦需預留至少30G的存儲空間以用于安裝該程序。…

Android 之 面試八股文

?1.Activity生命周期????問題??&#xff1a;描述Activity從啟動到銷毀的完整生命周期方法&#xff0c;并說明onSaveInstanceState()的調用時機。??參考答案??&#xff1a;onCreate()→ onStart()→ onResume()&#xff08;活躍狀態&#xff09; → onPause()&#x…

暴力解決MySQL連接失敗

本文涉及清空root密碼完全重置MySQL權限徹底卸載并重裝MySQL請務必在測試/本地環境操作&#xff0c;生產環境慎用&#xff01;場景Spring Boot項目連接MySQL一直報Access denied for user rootlocalhost&#xff0c;改密碼、換驅動都沒用&#xff1f;步驟1&#xff1a;完全重置…

前端開發:CSS(1)—— 什么是CSS?

本文用于記錄前端開發的學習過程。前面我們已經學習了html的編寫&#xff0c;知道了Web開發的一些最基本的知識&#xff1b;在html的學習過程中&#xff0c;我們提到關于樣式的設計和修改常需要使用CSS來實現。那么CSS到底是什么東西呢&#xff1f;它又如何來設計樣式呢&#x…

數據結構(4)—棧和隊列

一、概念1.棧只允許在棧頂位置入棧和出棧元素&#xff0c;鏈表可以在任意位置插入和刪除元素&#xff0c;棧和隊列只允許在指定位置插入和刪除元素2.鏈表、棧和隊列都是一種線性結構&#xff08;一對一&#xff09;&#xff0c;棧和隊列是一種特殊的表狀結構二、棧1.基礎概念先…

vue2.如何給一個頁面設置動態的name。不同路由使用一樣的組件。頁面不刷新怎么辦?

page里面detail.vue export default { name: detail, } vue2里面.vue的頁面都會設置一個name&#xff0c;這個通常是寫死的。不能在頁面動態設置的。頁面刷新緩存通常都是根據這個name來判斷的。如果name寫死。我幾個頁面都通用這一個頁面的話&#xff0c;他也不刷新頁面啊。 比…

浮動IP(Floating IP)的刪除通常需要滿足什么條件

浮動IP&#xff08;Floating IP&#xff09;的刪除通常需要滿足什么條件在云計算或網絡環境中&#xff0c;浮動IP&#xff08;Floating IP&#xff09;的刪除通常需要滿足一定的條件&#xff0c;以確保操作不會影響現有業務或導致網絡中斷。以下是常見的可刪除浮動IP的場景和條…

機器學習之隨機森林(Random Forest)實戰案例

一、算法基礎 首先&#xff0c;來介紹一下算法的基礎語法 class sklearn.ensemble.RandomForestClassifier(\ n_estimators’warn’,\ criterion’gini’,\max_depthNone, \ min_samples_split2,\ min_samples_leaf1, \ min_weight_fraction_leaf0.0, \ max_features’auto’…

《C語言》指針練習題--1

《C語言》指針練習題–1 1. 交換兩個整數的值 題目描述&#xff1a; 編寫一個C程序&#xff0c;定義一個函數swap&#xff0c;使用指針參數交換兩個整數的值。在main函數中調用該函數并輸出交換后的結果。 解題思路&#xff1a; 為了交換兩個整數的值&#xff0c;可以通過指針傳…

應急響應整理

目錄 windows下 1. 檢查賬號安全 利用注冊表實現用戶隱藏 粘滯鍵后門 2 檢查異常端口、進程 3. 檢查啟動項、計劃任務、服務 4. 日志分析-Windows 常見事件類型、登錄類型 Linux下 1. 賬號安全 2. 歷史命令 3. 檢查異常端口 4. 檢查異常進程 5. 檢查開機啟動項 …

一文讀懂 C# 中的 Bitmap

一文讀懂 C# 中的 Bitmap 一、Bitmap 到底是什么? 二、推薦使用場景 三、實戰 Demo 基礎用法:加載、創建和保存 進階用法 縮放圖片 裁剪圖片 顏色調整(反色處理) 四、核心方法和屬性說明 常用函數 常用屬性 五、避坑指南、注意事項 六、總結與決策 一文讀懂 C# 中的 Bitmap…