順序表和鏈表的對比(一)

前言

今天給小伙伴們分享的是在數據結構中順序表和鏈表的對比。它們在計算機科學和軟件開發中具有廣泛的應用,是理解更復雜數據結構(如棧、隊列、樹、圖等)的基礎。這次將會給大家從定義初始化,以及功能增刪查改上進行詳細對比,以便于大家掌握并使用。那讓咱們開始吧@

一.基本知識概述

考慮到可能有些小伙伴還沒了解到順序表或鏈表,就先概述一下關于它們的基本知識。

1.順序表

順序表(Sequential List)?是用一段物理地址連續的存儲單元依次存儲數據元素的線性結構。一般是使用數組方式實現?它的元素在內存中是連續存儲的。順序表是數據結構中最基礎的一種線性表,具有高效的隨機訪問特性,但在插入和刪除操作上效率較低

2.鏈表

鏈表(Linked List)? 一種在物理存儲結構上非連續、非順序的存儲結構,又因為在節點結構和操作上不同分有(雙鏈表還細分是否循環與是否帶哨兵位頭節點):雙鏈表(Doubly Linked List)和單鏈表(Singly Linked List)。鏈表與順序表不同,它是靠指針鏈接實現的,順序表的元素在內存中是連續存儲的,而鏈表的元素可以分散在內存的任何位置。因此它在插入和刪除上效率比順序表更高些。

二.定義及初始化

1.順序表

順序表通常由以下部分組成:

  1. 數據存儲區

    一個數組(需要考慮數據大小,是否需要自主開辟空間和擴容),用于存儲元素。
  2. 長度信息

    一個變量,用于記錄當前順序表中元素的數量
靜態順序表

(靜態的意思是存儲空間有限)首先定義一個結構體,然后在結構體里再定義一個數組以及一個整型變量來顯示順序表長度,不知道數據具體大小的時候,使用起來比較麻煩,容易產生數組越界以及空間浪費問題,這里推薦使用動態的順序表。

#define MAX_SIZE 100 // 定義一個能容納所有數據的容量,這個屬于靜態順序表了,不易把控使用空間//一般推薦大家使用動態順序表typedef struct SequentialList
{int data[MAX_SIZE]; // 數據存儲區int length;         // 當前順序表的長度
} SL;

靜態順序表的初始化比較簡單,只需初始化長度即可

void InitList(SL* ps) 
{L->length = 0; // 初始化長度為 0
}
動態順序表

動態順序表則在空間使用上更加靈活,使用數組指針,通過?malloc 函數開辟所需空間,如果不夠再使用realloc 函數進行擴容,但是需考慮內存泄漏問題,以及后續使用完空間的釋放問題。

typedef int SLDataType; //定義數組類型,方便存儲各種類型不同的數據#define INIT_CAPACITY 4 //定義一個空間容量,方便后續擴容// 動態順序表 -- 按需申請
typedef struct SequentialList
{SLDataType* a;int size;     // 有效數據個數int capacity; // 空間容量
}SL;

對比于靜態順序表,動態順序表初始化則較為復雜一點

(擴容函數的使用放在數據插入,不夠再擴,節省空間)

void SLInit(SL* ps)
{assert(ps);ps->a = (SLDataType*)malloc(sizeof(SLDataType)* INIT_CAPACITY); 通過malloc 函數開辟空間if (ps->a == NULL)//若開辟失敗,返回錯誤信息{perror("malloc fail"); 	return;}ps->size = 0;ps->capacity = INIT_CAPACITY;
}

2.鏈表

鏈表的話則是通過結構體指針來實現,單鏈表和雙鏈表的定義差不多,主要區別在節點指針的數量及指向方向。雙鏈表較于單鏈表,支持雙向遍歷,增刪數據更加靈活,但在空間效率上略低于單鏈表,因為它有兩個節點指針,并且在維護時需要調整兩個指針,容易出錯。

1.?單鏈表(Singly Linked List)

  • 節點結構

    • 每個節點包含兩個部分:

      1. 數據域:存儲數據。

      2. 指針域:指向下一個節點的指針。

  • 鏈表結構

    • 鏈表由一系列節點組成,每個節點通過指針連接。

    • 鏈表的最后一個節點的指針域為?NULL,表示鏈表的結束。

typedef int SLTDataType;  定義數據類型,方便后續適用于存儲各種類型數據typedef struct SListNode
{SLTDataType data; struct SListNode* next; 指向下一個節點
}SLTNode;

單鏈表的初始化通過節點創造函數創建了一個節點并賦初值,然后把節點指針傳遞回插入函數(下期會詳細介紹)

SLTNode* CreatSLTNode(SLTDataType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode)); //創建節點if (newnode == NULL){perror("malloc fail"); //若開辟失敗,則返回錯誤信息return NULL;}newnode->data = x;newnode->next = NULL; //避免出現野指針return newnode; //返回節點指針到插入函數
}

2.?雙鏈表(Doubly Linked List)

  • 節點結構

    • 每個節點包含三個部分:

      1. 數據域:存儲數據。

      2. 前驅指針:指向前一個節點的指針。

      3. 后繼指針:指向下一個節點的指針。

  • 鏈表結構

    • 鏈表由一系列節點組成,每個節點通過前驅指針和后繼指針連接。

    • 鏈表的第一個節點的前驅指針為?NULL,最后一個節點的后繼指針為?NULL

雙鏈表的定義則比單鏈表多一個指針,于是便有了訪問上一個節點的功能

typedef int LTDataType; 定義數據類型,方便后續適用于存儲各種類型數據typedef struct ListNode
{struct ListNode* next; 指向下一個節點指針struct ListNode* prev; 指向上一個節點指針LTDataType data;
}SL;

雙鏈表的初始化跟單鏈表差不多,多了一個回訪指針的初始化。


SL* CreatSListNode(LTDataType x)
{SL* node = (LTNode*)malloc(sizeof(LTNode));if (node == NULL){perror("malloc fail");//return NULL;exit(-1);//調用 exit 函數以非零狀態終止程序。}node->next = NULL;node->prev = NULL;//回訪指針,指向上一個節點node->data = x;return node;
}

在這里呢,再提一下帶哨兵位(sentinel node)頭節點的雙鏈表。先解釋一下什么是哨兵位節點(sentinel node)吧。

哨兵節點(sentinel node)是一種特殊的結點,它可以簡化鏈表中的操作,減少邊界條件的判斷和特殊處理,假如用它作頭節點,在進行鏈表增刪操作時就不用單獨考慮鏈表是否為空的情況了。

具體實現也很簡單,大家可以理解成跟不帶哨兵位節點時一樣,只不過之前是在頭節點中開始放數據,現在是在第二個節點中開始放數據,相當于頭節點里面數據是空的,頭節點是空指針。

// 創建新節點的函數SL*CreatSListNode(LTDataType x)
{SL* node = (LTNode*)malloc(sizeof(LTNode));if (node == NULL){perror("malloc fail");//return NULL;exit(-1);//調用 exit 函數以非零狀態終止程序。}node->next = NULL;node->prev = NULL;//回訪指針,指向上一個節點node->data = x;return node;
}// 初始化雙鏈表的函數void InitList(SL* L) 
{// 創建哨兵節點L->sentinel = (Node*)malloc(sizeof(Node));L->sentinel->prev = L->sentinel; // 哨兵節點的 prev 指向自己L->sentinel->next = L->sentinel; // 哨兵節點的 next 指向自己
}void InsertAtHead(SL* L, int x )
{SL* newNode = CreatSListNode(x);// 將新節點插入到哨兵節點之后newNode->next = L->sentinel->next;newNode->prev = L->sentinel;L->sentinel->next->prev = newNode;L->sentinel->next = newNode;
}

以上就是這期的內容,希望能給有需求的小伙伴們提供一些幫助,如果有疏漏的地方,小伙伴們可以直接指出,以便糾正,祝大家天天開心@

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

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

相關文章

星越L_外后視鏡使用講解

目錄 1.外后視鏡調節 2后視鏡折疊 3.后視鏡加熱 1.外后視鏡調節 L控制左邊后視鏡調節,上下撥動調整視野,一般此鏡左右21分,上下55開。 R控制左邊后視鏡調節,上下撥動調整視野,一般此鏡左右13分,上下55開。 2后視鏡折疊 車輛解鎖自動展開 車輛關閉自動折疊 嚴寒天氣…

DevOps實踐:持續集成與持續部署完全指南

文章目錄 引言:從人工到自動化的進化革命一、CI/CD核心認知升級1.1 持續集成 vs 持續部署 vs 持續交付1.2 中小團隊為什么要實施CI/CD? 二、CI/CD工具鏈選型指南2.1 中小團隊推薦技術棧2.2 工具對比決策矩陣 三、實戰五步構建企業級流水線3.1 基礎環境搭…

【數據結構】數據結構,算法 概念

0.本篇問題: 數據、數據元素、數據對象、數據項之間的基本關系?ADT是什么?數據結構的三要素?數據的邏輯結構有哪些?數據的存儲結構有哪些?算法的五個特征?O(1) O(logn) O(n^n) O(n) O(n^2…

同步Oracle及mysql至KADB的KFS配置文件參考

Oracle源端flysync.ini文件 注意:oracle用戶名大寫 mysql源端flysync.ini文件 附:目標端KADB的flysync.ini文件 [m_kes_3113] 源端為KES kufl-port3113 datasource-typekingbase rolemaster replication-host10.4.43.53 replication-port54321 …

PECL(Positive Emitter-Coupled Logic)電平詳解

一、PECL電平的定義與核心特性 PECL(正射極耦合邏輯)是一種基于 射極耦合邏輯(ECL)技術 的高速差分信號標準,采用 正電源供電(如5V或3.3V)。其核心特性包括 高速傳輸、低噪聲、強抗干擾能力&am…

以 ArcGIS Pro 為筆,繪就水墨地圖畫卷

一、引言 水墨畫,作為中國傳統繪畫藝術的瑰寶,以其獨特的韻味和表現力,在藝術領域占據著重要地位。它通過水與墨的交融,展現出山水之間的靈動與韻味。 而將這種藝術形式與現代地理信息系統(GIS)技術相結合…

軟考網絡安全專業

隨著信息技術的迅猛發展,網絡安全問題日益凸顯,成為社會各界普遍關注的焦點。在這樣的背景下,軟考網絡安全專業應運而生,為培養高素質的網絡安全人才提供了有力支撐。本文將對軟考網絡安全專業進行深入剖析,探討其在信…

在線 SQL 轉 SQLAlchemy:一鍵生成 Python 數據模型

一款高效的在線 SQL 轉 SQLAlchemy 工具,支持自動解析 SQL 語句并生成 Python SQLAlchemy 模型代碼,適用于數據庫管理、后端開發和 ORM 結構映射。無需手寫 SQLAlchemy 模型,一鍵轉換 SQL 結構,提升開發效率,簡化數據庫…

自定義tiptap插件

本文為開發開源項目的真實開發經歷,感興趣的可以來給我的項目點個star,謝謝啦~ 具體博文介紹: 開源|Documind協同文檔(接入deepseek-r1、支持實時聊天)Documind 🚀 一個支持實時聊天和接入 - 掘…

網絡安全需要學多久才能入門?

網絡安全是一個復雜且不斷發展的領域,想要入行該領域,我們需要付出足夠多的時間和精力好好學習相關知識,才可以獲得一份不錯的工作,那么網絡安全需要學多久才能入門?我們通過這篇文章來了解一下。 學習網絡安全的入門時間因個人的…

EG82088串口邊緣計算網關

EG82088串口邊緣計算網關 EG8208是一款專業級8路獨立隔離型RS485通訊控制器,通過Modbus及JSON支持、靈活的TCP/IP和UDP切換、內置監控自診斷等特性,廣泛應用于工業自動化、樓宇管理等領域,為用戶提供卓越的數據采集和設備管理解決方案。 接口類型:8RS485/8DO/1LAN協…

Linux下GCC和C++實現帶多組標簽的Snowflake SQL查詢批量數據導出程序

設計一個基于多個帶標簽Snowflake SQL語句作為json配置文件的Linux下GCC的C代碼程序,實現根據不同的輸入參數自動批量地將Snowflake數據庫的數據導出為CSV文件到本地目錄上,標簽加擴展名.csv為導出數據文件名,文件已經存在則覆蓋原始文件。需…

Trae AI 輔助修復uniapp 微信小程序的Bug

一、transparent的兼容問題 設計稿: 實際在iphone 6 plu上: 直接讓Trae AI修復: 修改后驗證通過。 二、v-if分支中子元素根據輸入框中內容長度動態添加class樣式失效 遇到了個“怪問題”,在其他手機或者開發者工具都正常。也…

conda install 和 pip install 的區別

conda install 和 pip install 是兩個常用的包安裝命令,但它們在很多方面存在差異。 1. 所屬管理系統不同 1.1 conda install conda install 是Anaconda和Miniconda發行版自帶的包管理工具 conda 的安裝命令。conda 是一個跨平臺的開源包管理系統和環境管理系統&…

uni-app App 端分段導出 JSON 數據為文件

在開發過程中,我們經常需要將大量數據導出為 JSON 文件,尤其是在處理長列表或大數據集時。然而,直接將所有數據寫入一個文件可能會導致性能問題,尤其是在移動設備上。為了優化性能并提高用戶體驗,我們可以將數據分段導…

視頻推拉流EasyDSS案例分析:互聯網直播/點播技術與平臺創新應用

隨著互聯網技術的快速發展,直播/點播平臺已成為信息傳播和娛樂的重要載體。特別是在電視購物領域,互聯網直播/點播平臺與技術的應用,不僅為用戶帶來了全新的購物體驗,也為商家提供了更廣闊的營銷渠道。傳統媒體再一次切實感受到了…

MySQL再次基礎 向初級工程師邁進

作者:在計算機行業找不到工作的大四失業者 Run run run ! ! ! 1、MySQL概述 1.1數據庫相關概念 1.2MySQL數據庫 2、SQL 2.1SQL通用語法 SQL語句可以單行或多行書寫,以分號結尾。SQL語句可以使用空格/縮進來增強語句的可讀性。MySQL數據庫的SQL語句不區…

手寫一個簡易版的tomcat

Tomcat 是一個廣泛使用的開源 Servlet 容器,用于運行 Java Web 應用程序。深入理解 Tomcat 的工作原理對于 Java 開發者來說是非常有價值的。本文將帶領大家手動實現一個簡易版的 Tomcat,通過這個過程,我們可以更清晰地了解 Tomcat 是如何處理…

VSTO(C#)Excel開發8:打包發布安裝卸載

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github:codetoys,所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的,可以在任何平臺上使用。 源碼指引:github源…

如何逐步迭代衍生出一個網絡安全產品

逐步迭代衍生出一個網絡安全產品需要結合市場需求、技術趨勢和用戶反饋,通過系統化的開發和優化過程來實現。以下是逐步迭代的詳細步驟: 1. 確定市場需求和產品定位 市場調研:分析當前網絡安全市場的痛點和趨勢,如云安全、零信任、…