順序表的總結及模擬實現

目錄

一.線性表

二.順序表

1.概念

?2.結構

3.要實現的接口函數

三.模擬實現順序表

1.定義出順序表的基本結構

2.實現檢查擴容功能

3.實現尾插

4.實現尾刪

5.實現頭插和頭刪

6.查找

7.修改

8.遍歷

9.在指定位置插入和刪除

四.順序表的優缺點及思考

?a.順序表的弊端


一.線性表

? 在談順序表前,我們要先說說線性表了,線性表(linear list)是n個具有相同特性的數據元素的有限序列。 線性表是一種在實際中廣泛使用的數據結構,常見的線性表:順序表、鏈表、棧、隊列、字符串...

? 線性表在邏輯上是線性結構,也就說是連續的一條直線。但是在物理結構上并不一定是連續的,線性表在物理上存儲時,通常以數組和鏈式結構的形式存儲。

? 說白了,線性表在邏輯上就是一條線性結構,數據之間的排列是一個接一個的,盡管它們在物理上不一定是線性的;

如下圖所示兩種線性表的邏輯結構,它們的數據看起來都是首尾相連的;

二.順序表

1.概念

? 順序表是用一段物理地址連續的存儲單元依次存儲數據元素的線性結構,一般情況下采用數組存儲。在數組上完成數據的增刪查改。

?2.結構

? ?順序表可以分為靜態順序表和動態順序表,靜態順序表采用定長數組的形式來存儲元素,而動態順序表則可以根據需要進行擴容,相對而言還是動態順序表更加實用,我們這里實現的也是動態順序表。

? 靜態與動態順序表的結構示意如下(c語言版)

? 其中,SLDataType是表示指定類型的宏定義,在c++中可以用模版來代替!size為有效元素的個數,capacity為數組的容量,不夠時可以通過realloc擴容;

3.要實現的接口函數

三.模擬實現順序表

? 模擬實現我們采用c++的方式來,因為寫起來更方便,而且初始化和銷毀都包含在構造函數和析構函數中了,無需我們手動調用;

1.定義出順序表的基本結構

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstdlib>
#include <assert.h>
using namespace std;
using DataType = int;
class seqList
{
public:seqList():_num(nullptr),_size(0),_capacity(0){}~seqList(){delete(_num);_size = 0;_capacity = 0;}private:DataType* _num;int _size;int _capacity;
};

2.實現檢查擴容功能

? 因為我們往數組里添加數據可能遇到數組空間不夠的情況,所以要能檢測到這種需要進行擴容的情況!

void SeqListCheckCapacity()
{if (_size == _capacity){int newcapacity = _capacity == 0 ? 4 : _capacity * 2;DataType* tmp = (DataType*)realloc(_num, sizeof(DataType) * newcapacity);if (tmp == nullptr){perror("擴容出錯:");return;}_num = tmp;_capacity = newcapacity;}
}

3.實現尾插

? 插入數據之前,要先檢查一下當前是否需要擴容了,這樣能夠確保空間足夠,插入數據之后不要忘記維護代表元素個數的_size;

void SeqListPushBack(DataType x)
{SeqListCheckCapacity();_num[_size++] = x;
}

4.實現尾刪

? 刪除數據前要先確保數組內還有剩余數據,如果有,只需要將元素個數減一即可,因為我們查找和遍歷順序表時都是通過_size來進行的!

void SeqListPopBack()
{assert(_size > 0);_size--;
}

5.實現頭插和頭刪

? ?只要是插入,就要首先判斷擴容,只要是刪除,就要先判斷是否有數據;

? ?頭插和頭刪的共同點是都要移動元素,對于頭插,我們在順序表頭部插入元素之前,必須將原來的所有數據整體往右移一位,才能給插入數據騰出空間,此時要頭插注意移動的方法,必須是從右往左進行的,每次都選取要移動到的位置,然后將左邊的數移到該位置;如果從左往右依次移動,會出現左邊值覆蓋右邊值的情況!

? 尾刪要先將數據向左集體移動一位,采用從左往右依次移動一位的方式;

void SeqListPushFront(DataType x)
{SeqListCheckCapacity();for (int i = _size; i > 0; i--){_num[i] = _num[i - 1];}_num[0] = x;_size++;
}
void SeqListPopFront()
{assert(_size > 0);for (int i = 0; i < _size - 1; i++){_num[i] = _num[i + 1];}_size--;
}

6.查找

? 沒啥好說的,就是遍歷數組找關鍵值

int SeqListFind(DataType x)
{for (int i = 0; i < _size; i++){if (_num[i] == x){return i;}}return -1;}

7.修改

void SeqListModity(int pos,DataType x)
{assert(pos >= 0 && pos < _size);_num[pos] = x;
}

8.遍歷

	void SeqListPrint(){for (int i = 0; i < _size; i++){printf("%d ", _num[i]);}}

9.在指定位置插入和刪除

要注意的地方前面都已經強調過了,就是要注意插入前的檢查擴容、元素的移動方式、size的維護、刪除前的檢查剩余數據

void SeqListInsert(int pos, DataType x)
{assert(pos >= 0 && pos < _size);SeqListCheckCapacity();for (int i = _size; i > pos; i--){_num[i] = _num[i - 1];}_num[pos] = x;_size++;
}
void SeqLIstDelete(int pos)
{assert(pos >= 0 && pos < _size);for (int i = pos; i < _size - 1; i++){_num[i] = _num[i + 1];}_size--;
}

四.順序表的優缺點及思考

?a.順序表的弊端

1. 中間/頭部的插入刪除,由于要整體移動元素,所以時間復雜度為O(N)
2. 由于realloc的特性:

  1. 原地調整:如果原內存塊后有足夠的空間,realloc會直接擴展內存塊,而無需移動數據。
  2. 重新分配:如果原內存塊后空間不足,realloc會分配一塊新的內存,并將原數據復制到新內存中,同時釋放原內存塊。

所以增容可能需要申請新空間,拷貝數據,釋放舊空間。會有不小的消耗。
3. 增容一般是呈2倍的增長,勢必會有一定的空間浪費。例如當前容量為100,滿了以后增容到? 200,我們再繼續插入了5個數據,后面沒有數據插入了,那么就浪費了95個數據空間。

b.順序表的優點

? 1.隨機訪問效率高

??順序表最大的優點是支持隨機訪問,通過下標可以直接訪問任意位置的元素,時間復雜度為O(1)。這使得順序表在需要頻繁查找或按索引訪問元素的場景中表現出色,比如數組操作。

? 2.存儲密度高

? 順序表在內存中是連續存儲的,不需要額外的空間來存儲元素之間的邏輯關系,因此存儲密度高。相比鏈表等結構,順序表在存儲相同數量元素時占用的內存更少。

? 3.緩存友好

? 由于順序表在內存中是連續存儲的,訪問元素時具有良好的局部性,能夠充分利用CPU緩存機制,提高訪問速度。這一點在處理大量數據時尤為重要。

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

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

相關文章

Vue3 vs Vue2:全面對比與面試寶典

文章目錄Vue3 vs Vue2&#xff1a;全面對比與面試寶典引言&#xff1a;Vue框架的進化之路一、核心架構對比二、響應式系統的革命Vue2的響應式&#xff1a;像老式監控攝像頭Vue3的響應式&#xff1a;像智能AI監控系統三、API風格的進化Vue2的Options API&#xff1a;像填表格Vue…

Java Web開發:Session與Cookie詳細入門指南

在Web開發中&#xff0c;狀態管理是核心需求之一。本文將深入講解Java中Session和Cookie的使用方法&#xff0c;幫助你掌握用戶狀態管理的核心技術。 一、Session與Cookie基礎概念 特性SessionCookie存儲位置服務器內存/持久化存儲客戶端瀏覽器安全性較高&#xff08;敏感數據…

HTTPS與CA證書:安全通信全解析

CA&#xff08;Certificate Authority&#xff09;&#xff1a;證書頒發機構&#xff0c;負責簽發和管理數字證書&#xff0c;驗證證書持有者的身份。HTTPS&#xff1a;基于 SSL/TLS 協議的 HTTP&#xff0c;通過證書實現客戶端與服務器的身份驗證和數據加密。HTTPSHTTPSSL/TLS…

AI生成代碼時代的商業模式重構:從“軟件即產品”到“價值即服務”

2025年,全球AI代碼生成市場規模突破63億元(數據來源:《中國AI代碼生成行業發展報告》),開發者效率提升40%以上,軟件開發成本下降30%。這一技術浪潮正在顛覆傳統軟件行業的商業邏輯——當代碼生成變得像文字編輯一樣簡單時,企業如何構建可持續的商業模式? 本文將從硬件…

C#特性與反射知識梳理

C#中的**特性&#xff08;Attributes&#xff09;和反射&#xff08;Reflection&#xff09;**是兩個非常重要的概念&#xff0c;它們通常用于代碼的元編程&#xff0c;允許你在運行時獲取類型信息并對其進行操作。下面對這兩個概念進行詳細梳理&#xff1a;一、C#中的特性&…

SQL 語法詳解

SQL 語法詳解 引言 SQL&#xff08;Structured Query Language&#xff09;是一種用于數據庫管理的標準語言&#xff0c;它允許用戶進行數據的查詢、更新、插入和刪除等操作。SQL語法是數據庫管理和編程的基礎&#xff0c;本篇文章將詳細介紹SQL的基本語法和常用操作&#xff0…

為什么 sim(3) 中的尺度 s 與旋轉 R 相乘,而不是平移 t?

文章目錄為什么 sim(3) 中的尺度 s 與旋轉 R 相乘&#xff0c;而不是平移 t&#xff1f;1?? sim(3) vs SE(3)&#xff1a;結構對比與核心差異2?? 為什么尺度 s 不乘在 t 上&#xff1f;&#x1f6ab; 數學破壞&#xff1a;&#x1f9ed; 幾何解釋&#xff1a;3?? t 是“相…

如何為你的 Docker 容器設置代理網絡

一文搞定!如何為你的 Docker 容器設置代理網絡(及一個最常見的“坑”) 你是否遇到過這樣的窘境:在你的服務器上,代理工具(比如 Clash, V2Ray)運行得好好的,瀏覽器也能科學上網,但一旦把應用放進 Docker 容器,它就瞬間“失聯”,無法訪問外部世界? 別擔心,這是每個…

LeetCode Day3 -- 哈希表

目錄 1. 啥是哈希表&#xff1f; 2. 啥時候用哈希表&#xff1f; 2.1 存在性檢查 → 集合Set 2.2 鍵值映射 → 字典Dict 2.3 頻率統計 → Dict or Counter 3. LeetCode 3.1 集合 &#xff08;1&#xff09;2215 找出兩數組的不同 &#xff08;2&#xff09;1207 獨一無…

三子棋裝置(電賽24E題)K230/STM32全開源

三子棋裝置&#xff08;電賽24E題&#xff09;K230/STM32全開源&#xff0c;后續有具體代碼參數講解&#xff0c;幫助大家移植k230代碼import time, os, sysfrom media.sensor import * from media.display import * from media.media import *from machine import UART from m…

終端安全檢測與防御

1. 終端安全風險主要問題&#xff1a;企業網絡中80%的安全事件源于終端&#xff0c;終端成為黑客攻擊的重要目標。攻擊手段&#xff1a;勒索病毒&#xff1a;直接勒索用戶。橫向滲透&#xff1a;通過受控終端攻擊內部服務器。僵尸網絡危害&#xff1a;信息竊取、釣魚網站引導、…

Video_AVI_Packet(2)

博主聲明&#xff1a;內容來自網絡&#xff0c;僅供參考&#xff0c;僅適用于淺了解&#xff0c;如有錯誤&#xff0c;自行甄別&#xff0c;由此引起的后果概不負責 Video_AVI_Packet&#xff08;2&#xff09;一、Video Picture Aspect Ratio 與 Active Format Aspect Ratio1.…

八月補丁星期二:微軟修復 111 個漏洞

微軟將在2025 年 8 月補丁星期二修復 111 個漏洞&#xff0c;這一數量與近期平均水平大致相同。 與上個月的情況類似&#xff0c;微軟知道今天發布的漏洞中只有一個已被公開披露&#xff0c;但聲稱沒有證據表明存在野外利用。同樣&#xff0c;截至發布時&#xff0c;唯一的補丁…

《C++進階之繼承多態》【普通類/模板類的繼承 + 父類子類的轉換 + 繼承的作用域 + 子類的默認成員函數】

【普通類/模板類的繼承 父類&子類的轉換 繼承的作用域 子類的默認構造函數】目錄前言&#xff1a;------------------------一、繼承的定義和使用1. 什么使繼承&#xff1f;2. 為什么要引入繼承&#xff1f;3. 怎么使用繼承&#xff1f;① 父類&#xff08;基類&#xf…

Ubuntu22.04安裝OBS Studio

OBS官網的最新的雖然支持Ubuntu系統&#xff0c;但是只支持最新的24.2版本的&#xff0c;而我的電腦上的Ubuntu的版本是22.04&#xff0c;所以在網上尋求解決辦法&#xff0c;看到了這一片博客&#xff0c;作為參考來實現ubuntu22.04安裝OBS&#xff0c;這里提示一下&#xff0…

Ansible 基本使用

Ansible 清單 靜態主機清單 主機清單支持多種格式&#xff0c;例如ini、yaml、腳本等。 本次課程使用 ini 格式。 #創建主機清單[lykcontroller ~ 13:36:01]# vim inventory#vim添加controllernode1node2node3node4?#測試連接單個服務器[lykcontroller ~ 14:08:18]$ ansibl…

網絡資源模板--基于Android Studio 實現的九寨溝App

目錄 一、測試環境說明 二、項目簡介 三、項目演示 四、部設計詳情&#xff08;部分) 首頁 購票頁面 五、項目源碼 一、測試環境說明 電腦環境 Windows 11 編寫語言 JAVA 開發軟件 Android Studio (2020) 開發軟件只要大于等于測試版本即可(近幾年官網直接下載也…

系統架構設計師備考之架構設計實踐知識

1.信息系統架構設計理論與實踐1.1.基本概念信息系統架構定義目前關于信息系統架構較為權威的定義有&#xff1a; &#xff08;1&#xff09;信息系統架構是系統的結構&#xff0c;由軟件元素、元素外部可見屬性和元素間關系組成。 &#xff08;2&#xff09;信息系統架構是軟件…

【IgH EtherCAT】如何利用 RTAI 提供的實時任務和調度機制來構建一個高精度、確定性的工業控制應用

SVG圖展示了系統的分層架構&#xff1a;RTAI實時層&#xff1a;包含RT_TASK、信號量和定時器EtherCAT Master層&#xff1a;主站、域、從站配置和PDO映射EtherCAT網絡層&#xff1a;與實際硬件設備&#xff08;EL3162模擬輸入、EL2004數字輸出&#xff09;通信關鍵特點&#xf…

7款熱門智能電視文件管理器橫向評測

7款智能電視文件管理器橫向評測 在智能電視和電視盒子日益普及的今天&#xff0c;一款好用的文件管理器能讓您的數字生活更加便捷。本文為您評測了7款廣受歡迎的TV版文件管理器&#xff0c;助您找到最適合自己的工具。 1. ES文件瀏覽器TV版 ES文件瀏覽器是一款廣受歡迎的多功能…