數據結構——鏈表詳解

鏈表

文章目錄

  • 鏈表
    • 前言
    • 認識鏈表
        • 單鏈表結構圖
        • 帶頭單循環鏈表結構圖
        • 雙向循環鏈表結構圖
        • 帶頭雙向循環鏈表結構圖
      • 鏈表特點
    • 鏈表實現(帶頭雙向循環鏈表實現)
        • 鏈表結構體
        • (1) 新建頭節點
        • (2) 建立新節點
        • (3)尾部插入節點
        • (4)刪除節點
        • (5)頭部插入節點
        • (6) 頭刪節點
        • (7) 尋找節點
        • (8) pos位置插入節點
        • (9) 刪除pos位置節點
        • (10) 打印鏈表
        • 測試用例

前言

new一個奶黃包:沒關系,這條路我陪你走到底

在這里插入圖片描述

認識鏈表

單鏈表結構圖

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CAU6jKY6-1692328909256)(https://flowus.cn/preview/624afaec-e422-4877-8061-cb639a1325b7)]

帶頭單循環鏈表結構圖

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4euIvGQg-1692328833369)(鏈表+2506bbec-fbf0-438b-8319-a4e748b4a543/image.png)]

雙向循環鏈表結構圖

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1uetT2ky-1692328833370)(鏈表+2506bbec-fbf0-438b-8319-a4e748b4a543/image 1.png)]

帶頭雙向循環鏈表結構圖

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ITJxFGxY-1692328833370)(鏈表+2506bbec-fbf0-438b-8319-a4e748b4a543/image 2.png)]

鏈表特點

  • 單鏈表在內存中,并不是連續存儲的(邏輯上連續)。

  • 不支持隨機訪問

  • 插入時只需要改變指針指向

  • 沒有容量的概念

  • 可以高效的在任意位置插入&&刪除

  • 緩存利用率低

鏈表實現(帶頭雙向循環鏈表實現)

鏈表結構體

typedef int LTDataType;
typedef struct ListNode
{LTDataType data;struct ListNode* next;struct ListNode* prev;
}LTNode;

(1) 新建頭節點

LTNode* ListInit()//建立頭節點
{LTNode* phead = buyListNode(-1); //建立一個帶頭節點phead->next = phead;      phead->prev = phead;return phead;
}

(2) 建立新節點

LTNode* buyListNode(LTDataType x)//創建內存初始化數據  
{LTNode* newnode = (LTNode*)malloc(sizeof(LTNode)); //if (newnode == NULL){perror("malloc fail");exit(-1);}// 初始化:注意所對的結構來初始化newnode->next = NULL;newnode->prev = NULL;newnode->data = x;return newnode;
}

(3)尾部插入節點

void LTPushBack(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = buyListNode(x);LTNode* tail = phead->prev;tail->next = newnode;newnode->prev = tail;newnode->next = phead;phead->prev = newnode;
}

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-uzvehYMH-1692328833370)(鏈表+2506bbec-fbf0-438b-8319-a4e748b4a543/image 3.png)]

(4)刪除節點

void LTPopBack(LTNode* phead)
{assert(phead);LTNode* tail = phead->prev;  //記錄上一個節點LTNode* tailmove =tail->prev;  //記錄上一個節點的上一個節點tailmove->next = phead;    phead->prev = tailmove;free(tail);
}

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-hCUDDN9I-1692328833371)(鏈表+2506bbec-fbf0-438b-8319-a4e748b4a543/image 4.png)]

(5)頭部插入節點

void LTPushFront(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = buyListNode(x); LTNode* first = phead->next;newnode->next = first;first->prev = newnode;first->next = phead;phead->prev = first;
}

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Vx0P45G2-1692328833371)(鏈表+2506bbec-fbf0-438b-8319-a4e748b4a543/image 5.png)]

(6) 頭刪節點

void LTPopFront(LTNode* phead)
{assert(phead);  //判斷是否有頭節點assert(phead->next != NULL);  //判斷第一個節點是否存在LTNode* tail = phead->next;LTNode* tailmove = tail->next;tailmove->prev = phead;phead->next = tailmove;tailmove->next = phead;phead->prev = tailmove;free(tail);
}

在這里插入圖片描述

(7) 尋找節點

LTNode* LTFind(LTNode* phead, LTDataType x)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){if (cur->data == x){//printf("找到了");return cur;//返回指針}cur=cur->next; //每次都走到下一個節點直到phead}//printf("找不到");return NULL;
}

(8) pos位置插入節點

void LTInsert(LTNode* pos, LTDataType x)//頭插尾插都可以調用這個函數 
{assert(pos);LTNode* newnode = buyListNode(x); //新建一個節點LTNode* prev = pos->prev;   //記錄pos位置的前一個節點newnode->next = pos;   //新節點的下一個節點就是pospos->prev = newnode;   //pos位置節點prve就鏈接后面newnode->prev = prev;prev->next = newnode;
}

在這里插入圖片描述

(9) 刪除pos位置節點

void LTErase(LTNode* pos)  //刪除節點
{assert(pos);LTNode* prve = pos->prev;LTNode* next = pos->next;prve->next = next;next->prev = prve;free(pos);
}

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1IWfpl22-1692328833371)(鏈表+2506bbec-fbf0-438b-8319-a4e748b4a543/image 7.png)]

(10) 打印鏈表

void LTPrint(LTNode* phead)
{assert(phead);LTNode* cur = phead->next;while (cur!= phead){printf("-> %d ",cur->data );cur = cur->next;}}

測試用例

void test1()
{LTNode* ptail = ListInit();LTPushBack(ptail, 1);LTPushBack(ptail, 3);LTPushBack(ptail, 2);LTPushBack(ptail, 4);LTPushBack(ptail, 5);LTPopBack(ptail);LTPrint(ptail);
}

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

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

相關文章

網絡編程socket.close/output.close/socket.shutdownOutput區別與流程分析

文章目錄 三種方法效果的區別套接字Socket關閉與釋放的區別服務器執行三種關閉操作后,繼續發送/接收數據會發生什么socket.shutdownOutput 關閉連接 找了半個小時沒一個說明白的帖子,真的折磨 三種方法效果的區別 socket.close()Socket主動禁止輸入和輸…

APP外包開發原生和H5的區別

原生開發和H5開發是兩種不同的方法,用于創建移動應用程序。它們具有各自的特點、優勢和劣勢,適用于不同的應用場景。以下是原生開發和H5開發之間的一些主要區別,希望對大家有所幫助。北京木奇移動技術有限公司,專業的軟件外包開發…

DELETE 與TRUNCATE區別

DELETE 與TRUNCATE區別 要清空 PostgreSQL 中的表數據,可以使用 DELETE 或 TRUNCATE 語句。下面是兩種方法的示例: 使用 DELETE 語句清空表數據: DELETE FROM 表名;例如,要清空名為 users 的表數據: DELETE FROM u…

未來公文的智能化進程

隨著技術的飛速發展,公文——這個有著悠久歷史的官方溝通方式,也正逐步走向智能化的未來。自動化、人工智能、區塊鏈...這些現代科技正重塑我們的公文制度,讓其變得更加高效、安全和智慧。 1.語義理解與自動生成 通過深度學習和NLP&#xff…

14-案例:購物車

綜合案例-購物車 需求說明: 1. 渲染功能 v-if/v-else v-for :class 2. 刪除功能 點擊傳參 filter過濾覆蓋原數組 3. 修改個數 點擊傳參 find找對象 4. 全選反選 計算屬性computed 完整寫法 get/set 5. 統計 選中的 總價 和 數量 計算屬性conputed reduce條件求和 6. 持久化到本…

電子商務公開密鑰加密法

(一)定義與應用原理 公開密鑰加密法是針對私有密鑰加密法的缺陷而提出來的。是電子商務應 用的核心密碼技術。所謂公開密鑰加密,就是指在計算機網絡上甲、乙兩用戶之間 進行通信時,發送方甲為了保護要傳輸的明文信息不被第三方竊取,采用密…

從零基礎到精通IT:探索高效學習路徑與成功案例

文章目錄 導語:第一步:明確學習目標與方向選擇適合的IT方向設定具體的學習目標咨詢和調研 第二步:系統學習基礎知識選擇適合的編程語言學習數據結構和算法掌握操作系統和計算機網絡基礎 第三步:實踐項目鍛煉技能選擇合適的項目編寫…

聊一下操作系統 macOS 與 Linux

對于Windows操作系統大家都比較熟悉,也常拿它與Linux操作系統進行比較,兩者之間的差異也很明顯。但對于macOS 和 Linux的比較不太多,很多人認為它們很相似,因為這兩種操作系統都可以運行 Unix 命令。其實詳細比較下,兩…

Redis——哨兵模式(docker部署redis哨兵)+緩存穿透和雪崩

哨兵模式 自動選取主機的模式。 概述 主從切換技術的方法是:當主服務器宕機后,需要手動把一臺從服務器切換為主服務器,這就需要人工干預,費事費力,還會造成段時間內服務不可用。這不是一種推薦的方式,更多時候&…

前端開發怎么解決性能優化的問題? - 易智編譯EaseEditing

前端性能優化是確保網站或應用在加載速度、響應性和用戶體驗等方面達到最佳狀態的關鍵任務。以下是一些解決前端性能優化問題的方法: 壓縮和合并代碼: 壓縮和合并CSS、JavaScript和HTML文件可以減少文件大小,加快加載速度。使用壓縮工具&am…

【Linux】Linux下常用查看文件指令小結

0x00 前言 版本信息:Ubuntu 18.04.6 LTS 最后更新日期:2023.8.18 0x01 Linux下常用查看文件指令小結 cat file :顯示文件內容,支持-n選項,即cat -n file,表示加行號顯示文件內容,不過不適合看…

vue vs react

vue 簡介:漸進式 JavaScript 框架 來源:最初由 Evan You (尤雨溪)于2014年開發。Evan You之前在Google研究過AngularJS,并提取了Angular的部分特性以提供一個更輕量級的框架 版本: vue 1x:2014…

協同過濾推薦算法-基于Django+mysql的智能水果銷售系統設計(可做計算機畢設)

隨著科技的不斷發展,智能化已經成為各行各業的趨勢,水果銷售行業也不例外。智能水果銷售系統就是應運而生的一種智能化解決方案,它可以為用戶提供更加便捷、高效的購物體驗。其中,系統模塊是智能水果銷售系統的重要組成部分。 系…

tsconfig.json

概念 tsconfig.json所在位置是ts項目的根目錄,他的主要作用是自定義配置不同的選項來告訴編譯器如何編譯當前項目。 重要屬性 compilerOptions - 主要用來配置目標js版本(target)、模塊解析方式(moudle)、輸出目錄&am…

python實現文字轉語音

文字轉語音 簡介 pyttsx3是一個Python庫,用于文字轉語音的功能。它可以將文本轉換為語音,并使用不同的音頻引擎進行輸出。這個教程將向您介紹如何使用pyttsx3來創建自定義的語音應用程序。 安裝 使用以下命令安裝pyttsx3庫: pip install…

unet pytorch

1.單機多卡版本:代碼中的DistributedDataParallel (DDP) 部分對應單機多卡的分布式訓練方式 import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F from torch.utils.data import Dataset, DataLoader from torchvisi…

ArcPy將矢量屬性表批量轉換為Excel文件

要使用ArcPy將矢量屬性表批量轉換為Excel文件,可以按照以下步驟進行操作: 1. 導入所需的Python庫: import arcpy import pandas as pd 2. 設置工作空間和要素類路徑:將arcpy.env.workspace設置為包含要素類的工作空間路徑&…

【Apollo學習筆記】—— Planning模塊

前言 本文記錄學習planning模塊時的一些筆記,總體流程參照https://zhuanlan.zhihu.com/p/61982682中的流程圖,如上圖所示。 planning_component modules/planning/planning_component.cc PlanningComponent::Init部分首先完成規劃模式的選擇&#xff…

【Linux】POSIX信號量和基于環形隊列的生產消費者模型

目錄 寫在前面的話 什么是POSIX信號量 POSIX信號量的使用 基于環形隊列的生產消費者模型 寫在前面的話 本文章主要先介紹POSIX信號量,以及一些接口的使用,然后再編碼設計一個基于環形隊列的生產消費者模型來使用這些接口。 講解POSIX信號量時&#x…

記K8S集群工作節點,AnolisOS 8.6部署顯卡驅動集成Containerd運行時

1、安裝gcc #安裝編譯環境 yum -y install make gcc gcc-c2、下載顯卡驅動 點擊 直達連接 nvidia高級搜索下載歷史版本驅動程序(下載歷史版本驅動) https://www.nvidia.cn/Download/Find.aspx?langcn3、安裝驅動 安裝顯卡驅動 ./NVIDIA-Linux-x86…