考研408-數據結構完整代碼 線性表的順序存儲結構 - 順序表

線性表的順序存儲結構 - 順序表

1. 順序表的定義

? 用一組地址連續的存儲單元依次存儲線性表的數據元素,從而使邏輯上相鄰的兩個元素在物理位置上也相鄰

2. 順序表的特點

  • 隨機訪問: 即通過首地址和元素序號可以在O(1) 時間內找到指定元素!
  • 存儲密度高: 每個節點只存儲數據節點!(鏈表還要存儲指針)
  • 不宜與插入刪除與擴容: 進行這些操作需要進行大量的元素移動操作

3. 順序表的相關代碼(Dev-C++)

? 本代碼使用萬能頭文件,如果運行失敗,請自行修改頭文件!

  • 順序表創建 - 靜態分配
#include<bits/stdc++.h>
#define MAXSIZE 10 //最大長度
using namespace std;typedef struct{int data[MAXSIZE]; //靜態數組存放數據元素int length;
}SeqList;//初始化順序表
void InitSeqList(SeqList &L){for(int i = 0 ; i < MAXSIZE ; i++ ){L.data[i] = 0;}L.length = 0;
}int main(){SeqList L;InitSeqList(L); return 0;
}
  • 順序表創建 - 動態分配
#include<bits/stdc++.h>
#define INITSIZE 10 //初始長度
using namespace std;typedef struct{int *data; //動態分配數組的指針int length;int MAXSIZE; //最大長度
}SeqList;//初始化順序表
void InitList(SeqList &L){L.data = (int*)malloc(INITSIZE*sizeof(int));L.length = 0;L.MAXSIZE = INITSIZE;cout << "初始化鏈表最大長度為:" << L.MAXSIZE << endl; 
}void IncreaseSize(SeqList &L, int len){int *p = L.data;L.data = (int *)malloc((L.MAXSIZE + len)*sizeof(int));for(int i = 0 ; i < L.length ; i ++){ //復制數據到新申請的區域L.data[i] = p[i];}L.MAXSIZE = L.MAXSIZE + len; //增加長度free(p);  //釋放內存空間cout << "增加后鏈表最大長度為:" << L.MAXSIZE; 
}int main() {SeqList L;InitList(L);int len;cout << "現在進行動態鏈表長度擴充:(請輸入增加長度):"; cin >> len;IncreaseSize(L,len);return 0;
}
  • 順序表的插入

? 順序表插入可以分解為兩個步驟:

? · 從后向前遍歷,將順序表中第 i 個元素及以后的元素都向后移動一個位置。

? · 將需要插入的元素 e 放入 L.data[i - 1] 的位置即可。

#include<bits/stdc++.h>
#define MAXSIZE 20
using namespace std;typedef struct{int data[MAXSIZE];int length;
}SeqList;void InitList(SeqList &L){for(int i = 0 ; i < MAXSIZE ; i++){L.data[i] = 0;}L.length = 5; //Test: L.length = 0; 這里初始化為長度為5,是為了下面輸出順序表可以看到 要不然測試的時候不會打印順序表!cout << "初始化后的順序表" << endl;for(int i = 0 ; i < L.length ; ++ i){cout << L.data[i] << " "; } cout << '\n'; 
}bool ListInsert(SeqList &L, int i, int e){if(i < 1 || i > L.length + 1) return false; //檢查要插入的位置是否合理if(L.length > MAXSIZE) return false; //檢查長度是否允許繼續插入for(int j = L.length ; j >= i ; -- j ){ //從后向前遍歷,一次向后挪動一個位置L.data[j] = L.data[j - 1];}L.length ++; //記得增加表長L.data[i - 1] = e;cout << "插入元素后的順序表" << endl;for(int i = 0 ; i < L.length ; ++ i){cout << L.data[i] << " "; } cout << '\n'; 
}int main(){SeqList L;int i, e;InitList(L);cout << "請輸入要插入的位置及元素:" << endl;cin >> i >> e; ListInsert(L, i, e);return 0;	
}

? 時間復雜度分析:

? 最好情況:要在最后一個位置插入元素,那么不需要移動元素,時間復雜度為O(1)

? 最壞情況:要在表頭插入一個元素,那么所有元素都需要向后移動一個位置,時間復雜度為O(n)。其中 n 為表長度。

? 平均情況:要插入的元素插入到任何一個位置的概率相同,平均時間復雜度為O(n)

  • 順序表的刪除

? 順序表的刪除(這里指刪除第 i 個位置的元素)可以分為兩個步驟:

? · 將第 i 個位置的元素賦值給 e。這個目的是傳回,如果沒必要的話其實可以不用這個步驟。

? · 從 i 位置開始向后遍歷,讓后面的元素都向前移動,填補刪除元素的位置。

#include<bits/stdc++.h>
#define MAXSIZE 10
using namespace std;typedef struct{int data[MAXSIZE];int length;
}SeqList;void InitList(SeqList &L){for(int i = 0 ; i < MAXSIZE ; ++ i){L.data[i] = 0;} L.length = 5; //Test: L.length = 5;cout << "初始化后的順序表" << endl;for(int i = 0 ; i < L.length ; ++ i){cout << L.data[i] << " "; } cout << '\n'; 
}bool ListDel(SeqList &L, int i, int &e){ //這里的e只是為了把刪除的元素帶回if(i < 1 || i > L.length) return false; //檢查合理性if(L.length == 0) return false;e = L.data[i - 1];for(int j = i ; j < L.length ; ++ j){L.data[j - 1] = L.data[j];}L.length --; //記得減少長度cout << "刪除后的順序表" << endl;for(int i = 0 ; i < L.length ; ++ i){cout << L.data[i] << " "; } cout << '\n'; return true;
}int main(){SeqList L;int i, e;InitList(L);cout << "請輸入要刪除第幾個元素" << endl;cin >> i;if(ListDel(L, i, e)){cout << "刪除成功!刪除的元素為:" << e << endl; }else{cout << "刪除失敗!" << endl;}return 0;
}

? 時間復雜度分析:

? 最好情況:刪除表尾元素,那么不需要移動元素,時間復雜度為O(1)

? 最壞情況:刪除表頭元素,那么n - 1元素都需要向前移動一個位置,時間復雜度為O(n)。其中 n 為表長度。

? 平均情況:刪除任何一個位置的元素概率都相同,那么平均時間復雜度為O(n)

  • 順序表按位查找

? GetElem(L, i, e) 函數,傳入要查找的位號,即要查找第幾個元素,e是為了帶回該元素的值!

#include<bits/stdc++.h>
#define MAXSIZE 10
using namespace std;typedef struct{int data[MAXSIZE];int length;
}SeqList;void InitList(SeqList &L){for(int i = 0 ; i < MAXSIZE ; ++ i){L.data[i] = i;}L.length = 5; //Test: L.length = 5;cout << "初始化后的順序表" << endl;for(int i = 0 ; i < L.length ; ++ i){cout << L.data[i] << " "; } cout << '\n'; 
}int GetElem(SeqList &L, int i, int &e){if(i < 1 || i > L.length) return false;if(L.length == 0) return false;e = L.data[i - 1];return e;
}int main(){SeqList L;int i;int e;InitList(L);cout << "請輸入查找第幾個元素:" << endl; cin >> i;if(GetElem(L, i, e)){cout << "查找成功,該元素為:" << e << endl;}else{cout << "查找失敗!" << endl; }return 0;
}

? 時間復雜度分析: O(1),因為可以直接通過索引訪問元素。

  • 順序表按值查找

? LocateElem(L, e, loc) 函數,傳入要查找的元素值,loc 是為了帶回該元素的位序!

#include<bits/stdc++.h>
#define MAXSIZE 10
using namespace std;typedef struct{int data[MAXSIZE];int length;
}SeqList;void InitList(SeqList &L){for(int i = 0 ; i < L.length ; ++ i){L.data[i] = i;}L.length = 5; //Test: L.length = 0;cout << "初始化后的順序表" << endl;for(int i = 0 ; i < L.length ; ++ i){cout << L.data[i] << " "; } cout << '\n'; 
}int LocateElem(SeqList &L, int e, int &loc){for(int i = 0 ; i < L.length ; ++ i){if(L.data[i] == e){loc = i + 1;return loc;}}return false;
}int main(){SeqList L;int e;int loc;InitList(L);cout << "請輸入要查找的數值" << endl;cin >> e;if(LocateElem(L, e, loc)){cout << "查找成功,該元素位于第" << loc << "個位置!" << endl;}else{cout << "查找失敗!" << endl; }return 0;
}

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

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

相關文章

【經驗分享】SpringBoot集成WebSocket開發02 之 實現一個基本示例并Spring Bean注入的方式來組織代碼

結合Spring Boot和WebSocket實現一個基本示例&#xff0c;并且使用Spring Bean注入的方式來組織代碼。 1. 創建Spring Boot項目 首先&#xff0c;確保你有一個Spring Boot項目&#xff0c;并在pom.xml文件中引入了WebSocket相關的依賴。 <dependencies><!-- Spring…

DeepSeek-R1大模型微調技術深度解析:架構、方法與應用全解析

1. DeepSeek-R1大模型架構設計與技術特性 1.1 架構設計 DeepSeek-R1作為超大規模語言模型,其核心架構設計包含以下創新: 專家混合架構(MoE) 采用6710億參數的混合專家架構(MoE),每個推理過程僅激活370億參數,實現計算效率與資源利用率的突破性提升。 Transformer框架…

本地部署Hive集群

規劃 服務機器Hive本體部署在Node1元數據服務所需的關系型數據庫(MYSQL)部署在Node1 安裝MYSQL數據庫 # 更新密鑰 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022# 安裝Mysql yum庫 rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.…

緩存之美:Guava Cache 相比于 Caffeine 差在哪里?

大家好&#xff0c;我是 方圓。本文將結合 Guava Cache 的源碼來分析它的實現原理&#xff0c;并闡述它相比于 Caffeine Cache 在性能上的劣勢。為了讓大家對 Guava Cache 理解起來更容易&#xff0c;我們還是在開篇介紹它的原理&#xff1a; Guava Cache 通過分段&#xff08;…

2025年【廣東省安全員C證第四批(專職安全生產管理人員)】考試及廣東省安全員C證第四批(專職安全生產管理人員)模擬試題

安全生產是各行各業不可忽視的重要環節&#xff0c;特別是在廣東省這樣的經濟大省&#xff0c;安全生產的重要性更是不言而喻。為了確保安全生產管理人員具備足夠的專業知識和實際操作能力&#xff0c;廣東省定期舉辦安全員C證考試。本文將詳細介紹2025年廣東省安全員C證第四批…

傳輸層自學

傳輸實體&#xff1a;完成傳輸層任務的硬件或軟件 可能位于&#xff1a; 操作系統內核獨立的用戶進程綁定在網絡應用中的鏈接庫網絡接口卡 1.功能&#xff1a; 網絡層與傳輸層作用范圍比較&#xff1f; 網絡層負責把數據從源機送達到目的機 傳輸層負責把數據送達到具體的應…

【C語言】函數和數組實踐與應用:開發簡單的掃雷游戲

【C語言】函數和數組實踐與應用&#xff1a;開發簡單的掃雷游戲 1.掃雷游戲分析和設計1.1掃雷游戲的功能說明&#xff08;游戲規則&#xff09;1.2游戲的分析與設計1.2.1游戲的分析1.2.2 文件結構設計 2. 代碼實現2.1 game.h文件2.2 game.c文件2.3 test.c文件 3. 游戲運行效果4…

Spring Cloud Config - 動態配置管理與高可用治理

引言&#xff1a;為什么需要配置中心&#xff1f; 在微服務架構中&#xff0c;配置管理面臨分散化、多環境、動態更新三大挑戰。傳統基于application.yml等配置文件的硬編碼方式&#xff0c;導致以下問題&#xff1a; ? 環境差異&#xff1a;開發、測試、生產環境配置混雜&a…

Git 常用命令指南

本文檔旨在提供 Git 的常用命令及其使用示例&#xff0c;涵蓋全局參數配置、獲取本地倉庫、基本概念、本地倉庫操作、遠程倉庫操作和分支操作等內容。 1. 全局參數配置 Git 允許用戶配置全局參數&#xff0c;以便在所有的倉庫中共享這些設置。 <BASH> # 設置用戶名 gi…

基于Python+Flask+MySQL+HTML的爬取豆瓣電影top-250數據并進行可視化的數據可視化平臺

FlaskMySQLHTML 項目采用前后端分離技術&#xff0c;包含完整的前端&#xff0c;以flask作為后端 Pyecharts、jieba進行前端圖表展示 通過MySQL收集格列數據 通過Pyecharts制作數據圖表 這是博主b站發布的詳細講解&#xff0c;感興趣的可以去觀看&#xff1a;【Python爬蟲可…

rpc grpc

RPC Remote Procedure Call&#xff0c;遠程過程調用&#xff0c;是用來屏蔽分布式計算中的各種調用細節&#xff0c;使得調用遠端的方法就像調用本地的一樣。 客戶端與服務端溝通的過程 客戶端發送數據(以字節流的方式)&#xff1b;&#xff08;編碼&#xff09;服務端接受…

GStreamer —— 2.15、Windows下Qt加載GStreamer庫后運行 - “播放教程 1:Playbin 使用“(附:完整源碼)

運行效果 介紹 我們已經使用了這個元素&#xff0c;它能夠構建一個完整的播放管道&#xff0c;而無需做太多工作。 本教程介紹如何進一步自定義&#xff0c;以防其默認值不適合我們的特定需求。將學習&#xff1a; ? 如何確定文件包含多少個流&#xff0c;以及如何切換 其中。…

30、Vuex 為啥可以進行緩存處理

Vuex 狀態管理基礎與緩存的關聯 Vuex 的核心概念&#xff1a; Vuex 主要由五個部分組成&#xff1a;state、mutations、actions、getters和modules。其中&#xff0c;state是存儲數據的地方&#xff0c;類似于一個全局的數據倉庫。在這個菜譜 APP 的例子中&#xff0c;緩存的數…

25屆數字IC驗證秋招總結

一、個人概況 雙非本9碩&#xff0c;2024年初開始通過白皮書藍皮書自學驗證&#xff0c;半年實習經驗&#xff0c;有競賽無專利論文&#xff0c;在秋招期間投遞企業130余家&#xff0c;絕大部分投遞崗位為數字驗證&#xff0c;面試20家&#xff0c;收到5個offer。因為背景和相關…

【商城實戰(37)】Spring Boot配置優化:解鎖高效商城開發密碼

【商城實戰】專欄重磅來襲&#xff01;這是一份專為開發者與電商從業者打造的超詳細指南。從項目基礎搭建&#xff0c;運用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用戶、商品、訂單等核心模塊開發&#xff0c;再到性能優化、安全加固、多端適配&#xf…

網頁制作12-html,css,javascript初認識のJavascipt腳本基礎

一、JavaScript的三種基本使用方法:body|head|外部 網頁效果: 運行代碼: .html <!doctype html> <html> <head> <meta charset="utf-8"> <title>無標題文檔</title><script> function n1(){document.getElementById(…

全面對比分析:HDMI、DP、DVI、VGA、Type-C、SDI視頻接口特點詳解

在當今的多媒體時代&#xff0c;視頻接口的選擇對于設備連接和顯示效果至關重要。不同的視頻接口在傳輸質量、兼容性、帶寬等方面各有優劣。本文將全面對比分析常用的視頻接口HDMI、DP、DVI、VGA、Type-C、SDI&#xff0c;幫助讀者更好地理解它們的特點和適用場景。 一、HDMI&…

麒麟服務器操作系統PostgreSQL環境部署手冊

軟件簡介 PostgreSQL 是一個免費的對象-關系數據庫服務器(ORDBMS),在靈活的BSD許可證下發行。 ORDBMS(對象關系數據庫系統)是面向對象技術與傳統的關系數據庫相結合的產物,查詢處理是 ORDBMS 的重要組成部分,它的性能優劣將直接影響到DBMS 的性能。 軟件環境 操作系統…

【藍橋杯速成】| 4.遞歸

遞歸 題目一&#xff1a;最大公約數 問題描述 1979. 找出數組的最大公約數 - 力扣&#xff08;LeetCode&#xff09; 給你一個整數數組 nums &#xff0c;返回數組中最大數和最小數的 最大公約數 。 兩個數的 最大公約數 是能夠被兩個數整除的最大正整數。 解題步驟 需要…

當大模型訓練遇上“雙向飆車”:DeepSeek開源周 DualPipe解析指南

前言 在大模型訓練中&#xff0c;傳統流水線并行因單向數據流和通信延遲的限制&#xff0c;導致GPU利用率不足60%&#xff0c;成為算力瓶頸。DeepSeek團隊提出的DualPipe雙向流水線架構&#xff0c;通過雙向計算流與計算-通信重疊的創新設計&#xff0c;將前向與反向傳播拆解為…