C語言_數據結構總結2:動態分配方式的順序表

0——靜態分配內存的順序表和動態分配內存的順序表的相同之處和不同之處

相同之處
  • 基本操作邏輯相同:無論是靜態分配還是動態分配的順序表,其核心的操作邏輯是一致的。例如插入操作都需要將插入位置之后的元素依次后移,刪除操作都需要將刪除位置之后的元素依次前移,查找操作也都是通過遍歷或者直接定位來完成。

  • 數據元素存儲方式相同:兩種順序表都是將數據元素依次存儲在連續的內存空間中,都可以通過數組下標來直接訪問元素,時間復雜度為?\(O(1)\)。

  • 功能用途相同:都用于實現線性表的功能,支持數據的插入、刪除、查找等基本操作。

不同之處
  • 內存分配方式

    • 靜態分配:在編譯時就確定了順序表的最大容量,使用數組來存儲元素,數組的大小在程序運行過程中不能改變。

    • 動態分配:在程序運行時根據需要動態地分配內存空間,可以通過?mallocrealloc?等函數來調整順序表的容量。

  • 內存管理

    • 靜態分配:不需要手動管理內存,數組的內存空間由系統自動分配和釋放。

    • 動態分配:需要手動管理內存,使用?malloc?分配內存,使用?free?釋放內存,否則會造成內存泄漏。

  • 表長限制

    • 靜態分配:順序表的最大長度是固定的,一旦達到最大長度就無法再插入新的元素。

    • 動態分配:可以根據需要動態地調整順序表的容量,理論上只要系統有足夠的內存,就可以不斷地插入新的元素。

? ?純C語言代碼,不涉及C++? ?

代碼實現

0. 變量聲明

#include<stdio.h>
#include<stdlib.h>

#define InitSize 50 ?//初始容量
#define Increment 10 ?//每次擴容的增量
typedef int ElemType;

typedef struct SeqList {
?? ?ElemType* data; ?//動態分配數組的指針
?? ?int length; ? ? ?//順序表當前的長度(元素個數)
?? ?int capacity; ? ?//順序表當前容量
}SeqList;

1.初始化

void InitSeqList(SeqList* L) {L->data = (ElemType*)malloc(sizeof(ElemType) * InitSize);if (L->data == NULL){printf("內存分配失敗!\n");exit(1);  // 退出系統操作}L->length = 0;L->capacity = InitSize;
}

2.擴容

void IncreaseCapacity(SeqList* L) {ElemType* newData = (ElemType*)realloc(L->data,(sizeof(ElemType)) * (InitSize + Increment));if (newData == NULL){printf("內存分配失敗!\n");exit(1);  // 退出系統操作}L->data = newData;L->capacity += Increment;
}

3.插入

即:在第pos個位置插入value值,即在數組下標pos-1的位置插入value值

int InsertSeqList(SeqList* L,int pos ,ElemType value) {//1.判斷插入位置是否合法if (pos < 1 || pos > L->length + 1){printf("插入位置不合法!\n");return -1;}//2.判斷順序表存儲空間是否滿了if (L->length >= L->capacity){IncreaseCapacity(L);  //空間不足,進行擴容操作}//3.將第pos個位置及往后的元素都后移一個位置,空出第pos個位置(這里采用逆序遍歷)for(int i = L->length; i >= pos; i++){L->data[i] = L->data[i - 1];}//4.插入數據L->data[pos - 1] = value;//5.表長加1L->length++;return 0;  //插入成功
}

4.按位查找

即:返回第pos個位置對應的value值

int findValueByPos(SeqList* L, int pos, ElemType* value) {//1.判斷要查找的位置是否合理if (pos < 1 || pos > L->length){printf("查找位置不在當前順序表范圍內!\n");}//2.查找第pos個位置對應的value值*value = L->data[pos - 1];return 0; //查找成功
}

5.按值查找

即:返回value值對應的位序,即第幾個,下標是位序減1

int findPosByValue(SeqList* L, ElemType value) {for (int i = 0; i < L->length ; i++){if (L->data[i] == value) {return i + 1;}}return -1;  //未在該順序表中找到該值
}

6.刪除

即:將第pos個的值賦值交給value變量存儲后騰開第pos個位置
? ? ?然后將第pos個后的數據都往前移動一個位置,填補第pos個位置

int deleteSeqList(SeqList* L, int pos,ElemType* value) {//1. 判斷刪除位置是否合理,即是否在存有數據的范圍內if (pos < 1 || pos > L->length){printf("待刪除位置不在合理范圍內!\n");return -1; }//2. 判斷空間是否為空if (L->length == 0){printf("當前空間未存有數據,無法完成刪除操作!\n");}//3.將要被刪除的數據賦值(轉存于)value變量*value = L->data[pos - 1];//4.將第pos個位置往后的元素都往前挪一個位置for (int i = pos; i < L->length; i++){L->data[i - 1] = L->data[i];}//5.表長減1L->length--;return 0; //刪除成功
}

7.注銷

void destroySeqList(SeqList* L) {if (L->data != NULL){free(L->data);L->data = NULL;L->length = 0;L->capacity = 0;}
}

8.打印

void printSeqList(SeqList* L) {if (L->length == 0){printf("當前順序表為空!\n");}else {for (int i = 0; i < L->length ; i++){if (i == L->length - 1) {printf("%d", L->data[i]);}else{printf("%d ", L->data[i]);}}printf("\n");}printf("--------------------------------------------------\n");
}

9.測試代碼

int main() {SeqList L;InitSeqList(&L);//插入數據測試if (InsertSeqList(&L,1,18) != 0){printf("插入失敗!\n");}if (InsertSeqList(&L,2,7) != 0){printf("插入失敗!\n");}if (InsertSeqList(&L,3,34) != 0){printf("插入失敗!\n");}printSeqList(&L); // 18 7 34//刪除數據測試ElemType value;if (deleteSeqList(&L, 2, &value) != 0){printf("刪除失敗!\n");}printSeqList(&L); // 18 34//按位查找測試,查找第1位的值是什么ElemType val;if (findValueByPos(&L,1,&val) == 0){printf("第1位的數據為:%d\n", val);  //第1位的數據為:18}else{printf("查找失敗!\n");}//按值查找測試,查找18在順序表的第幾個位置int pos = findPosByValue(&L, 18);if (pos != -1){printf("值18在順序表的第%d個位置\n", pos);  //值18在順序表的第1個位置}else{printf("查找失敗!\n");}//測試完記得執行銷毀操作,釋放空間內存destroySeqList(&L);return 0;
}

10.完整代碼

#include<stdio.h>
#include<stdlib.h>#define InitSize 50  //初始容量
#define Increment 10  //每次擴容的增量
typedef int ElemType;typedef struct SeqList {ElemType* data;  //動態分配數組的指針int length;      //順序表當前的長度(元素個數)int capacity;    //順序表當前容量
}SeqList;// 操作1——初始化
void InitSeqList(SeqList* L) {L->data = (ElemType*)malloc(sizeof(ElemType) * InitSize);if (L->data == NULL){printf("內存分配失敗!\n");exit(1);  // 退出系統操作}L->length = 0;L->capacity = InitSize;
}// 增加順序表的容量
void IncreaseCapacity(SeqList* L) {ElemType* newData = (ElemType*)realloc(L->data,(sizeof(ElemType)) * (InitSize + Increment));if (newData == NULL){printf("內存分配失敗!\n");exit(1);  // 退出系統操作}L->data = newData;L->capacity += Increment;
}//操作2——插入:在第pos個位置插入value值,即在數組下標pos-1的位置插入value值
int InsertSeqList(SeqList* L,int pos ,ElemType value) {//1.判斷插入位置是否合法if (pos < 1 || pos > L->length + 1){printf("插入位置不合法!\n");return -1;}//2.判斷順序表存儲空間是否滿了if (L->length >= L->capacity){IncreaseCapacity(L);  //空間不足,進行擴容操作}//3.將第pos個位置及往后的元素都后移一個位置,空出第pos個位置(這里采用逆序遍歷)for(int i = L->length; i >= pos; i++){L->data[i] = L->data[i - 1];}//4.插入數據L->data[pos - 1] = value;//5.表長加1L->length++;return 0;  //插入成功
}// 操作3——按位查找,即返回第pos個位置對應的value值
int findValueByPos(SeqList* L, int pos, ElemType* value) {//1.判斷要查找的位置是否合理if (pos < 1 || pos > L->length){printf("查找位置不在當前順序表范圍內!\n");}//2.查找第pos個位置對應的value值*value = L->data[pos - 1];return 0; //查找成功
}// 操作4——按值查找,即返回value值對應的位序,即第幾個,下標是位序減1
int findPosByValue(SeqList* L, ElemType value) {for (int i = 0; i < L->length ; i++){if (L->data[i] == value) {return i + 1;}}return -1;  //未在該順序表中找到該值
}// 操作5——刪除:將第pos個的值賦值交給value變量存儲后騰開第pos個位置
// 然后將第pos個后的數據都往前移動一個位置,填補第pos個位置
int deleteSeqList(SeqList* L, int pos,ElemType* value) {//1. 判斷刪除位置是否合理,即是否在存有數據的范圍內if (pos < 1 || pos > L->length){printf("待刪除位置不在合理范圍內!\n");return -1; }//2. 判斷空間是否為空if (L->length == 0){printf("當前空間未存有數據,無法完成刪除操作!\n");}//3.將要被刪除的數據賦值(轉存于)value變量*value = L->data[pos - 1];//4.將第pos個位置往后的元素都往前挪一個位置for (int i = pos; i < L->length; i++){L->data[i - 1] = L->data[i];}//5.表長減1L->length--;return 0; //刪除成功
}// 操作6——注銷
void destroySeqList(SeqList* L) {if (L->data != NULL){free(L->data);L->data = NULL;L->length = 0;L->capacity = 0;}
}//操作7——打印順序表中存放的數據
void printSeqList(SeqList* L) {if (L->length == 0){printf("當前順序表為空!\n");}else {for (int i = 0; i < L->length ; i++){if (i == L->length - 1) {printf("%d", L->data[i]);}else{printf("%d ", L->data[i]);}}printf("\n");}printf("--------------------------------------------------\n");
}int main() {SeqList L;InitSeqList(&L);//插入數據測試if (InsertSeqList(&L,1,18) != 0){printf("插入失敗!\n");}if (InsertSeqList(&L,2,7) != 0){printf("插入失敗!\n");}if (InsertSeqList(&L,3,34) != 0){printf("插入失敗!\n");}printSeqList(&L); // 18 7 34//刪除數據測試ElemType value;if (deleteSeqList(&L, 2, &value) != 0){printf("刪除失敗!\n");}printSeqList(&L); // 18 34//按位查找測試,查找第1位的值是什么ElemType val;if (findValueByPos(&L,1,&val) == 0){printf("第1位的數據為:%d\n", val);  //第1位的數據為:18}else{printf("查找失敗!\n");}//按值查找測試,查找18在順序表的第幾個位置int pos = findPosByValue(&L, 18);if (pos != -1){printf("值18在順序表的第%d個位置\n", pos);  //值18在順序表的第1個位置}else{printf("查找失敗!\n");}//測試完記得執行銷毀操作,釋放空間內存destroySeqList(&L);return 0;
}

11.運行截圖

如有問題,歡迎指出!

謝謝!

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

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

相關文章

Vue 與 Element UI 深度探秘:從 Array.isArray 到動態綁定的技術之旅!?

以下是一篇深入的技術博客&#xff0c;基于我們對 compare-form.vue 和 <w-form-select.vue> 的所有討論&#xff0c;涵蓋 Array.isArray、option-label/option-value、:list 動態綁定、: 語法以及 Vue 2/3 兼容性等問題。博客風格輕松有趣&#xff0c;加入 SVG 圖解和實…

計算機視覺|3D卷積網絡VoxelNet:點云檢測的革新力量

一、引言 在科技快速發展的背景下&#xff0c;3D 目標檢測技術在自動駕駛和機器人領域中具有重要作用。 在自動駕駛領域&#xff0c;車輛需實時、準確感知周圍環境中的目標物體&#xff0c;如行人、車輛、交通標志和障礙物等。只有精確檢測這些目標的位置、姿態和類別&#x…

前端打包優化相關 Webpack

前端打包優化相關 Webpack 打包時間的優化&#xff08;基于 Vue CLI 4 Webpack 5&#xff09; 1. Webpack 配置減少打包時間 1.1 對 JS 配置&#xff1a;排除 node_modules 和 src 中的打包內容 在開發環境下&#xff0c;修改 Webpack 的 JS 規則&#xff0c;排除 /node_m…

leetcode69.x 的平方根

題目&#xff1a; 給你一個非負整數 x &#xff0c;計算并返回 x 的 算術平方根 。 由于返回類型是整數&#xff0c;結果只保留 整數部分 &#xff0c;小數部分將被 舍去 。 注意&#xff1a;不允許使用任何內置指數函數和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。…

Docker 部署 MongoDB 并持久化數據

Docker 部署 MongoDB 并持久化數據 在現代開發中&#xff0c;MongoDB 作為 NoSQL 數據庫廣泛應用&#xff0c;而 Docker 則提供了高效的容器化方案。本教程將介紹如何使用 Docker 快速部署 MongoDB&#xff0c;并實現數據持久化&#xff0c;確保數據不會因容器重啟或刪除而丟失…

信奧賽CSP-J復賽集訓(模擬算法專題)(3):P1089 [NOIP 2004 提高組] 津津的儲蓄計劃

信奧賽CSP-J復賽集訓&#xff08;模擬算法專題&#xff09;&#xff08;3&#xff09;&#xff1a;P1089 [NOIP 2004 提高組] 津津的儲蓄計劃 題目描述 津津的零花錢一直都是自己管理。每個月的月初媽媽給津津 300 300 300 元錢&#xff0c;津津會預算這個月的花銷&#xff0…

日新F1、瑞研F600P 干線光纖熔接(熔接損耗最大0.03DB)

Ⅰ. 設備特性對比與實測驗證 1. 日新F1&#xff08;兩馬達&#xff09;極限參數 切割角度&#xff1a;必須≤0.3&#xff08;雙邊累計誤差&#xff1c;0.6&#xff09; ? 實測案例&#xff1a;切割0.35時&#xff0c;損耗波動達0.05-0.08dB&#xff08;超干線標準&#xff09…

【量化科普】Sharpe Ratio,夏普比率

【量化科普】Sharpe Ratio&#xff0c;夏普比率 &#x1f680;量化軟件開通 &#x1f680;量化實戰教程 在量化投資領域&#xff0c;夏普比率&#xff08;Sharpe Ratio&#xff09;是一個非常重要的風險調整后收益指標。它由諾貝爾經濟學獎得主威廉F夏普&#xff08;William…

數據結構--【順序表與鏈表】筆記

順序表 template <class T> class arrList :public List<T> //表示 arrList 類以公有繼承的方式繼承自 List<T> 類 //公有繼承意味著 List<T> 類的公共成員在 arrList 類中仍然是公共成員&#xff0c;受保護成員在 arrList 類中仍然是受保護成員。 { …

idea中隱藏目錄

可能的解決步驟&#xff1a; 排除目錄的方法是否在2021版本中有變化&#xff1f;應該沒有&#xff0c;還是通過右鍵標記為排除。 用戶可能想完全隱藏目錄&#xff0c;比如在項目視圖中不顯示&#xff0c;這可能需要調整項目視圖的設置&#xff0c;比如取消勾選“顯示排除的文件…

AWS 如何導入內部SSL 證書

SSL 證書的很重要的功能就是 HTTP- > HTTPS, 下面就說明一下怎么導入ssl 證書,然后綁定證書到ALB. 以下示例說明如何使用 AWS Management Console 導入證書。 從以下位置打開 ACM 控制臺:https://console.aws.amazon.com/acm/home。如果您是首次使用 ACM,請查找 AWS Cer…

2025最新群智能優化算法:基于RRT的優化器(RRT-based Optimizer,RRTO)求解23個經典函數測試集,MATLAB

一、基于RRT的優化器 基于RRT的優化器&#xff08;RRT-based Optimizer&#xff0c;RRTO&#xff09;是2025年提出的一種新型元啟發式算法。其受常用于機器人路徑規劃的快速探索隨機樹&#xff08;RRT&#xff09;算法的搜索機制啟發&#xff0c;首次將RRT算法的概念與元啟發式…

doris: Oracle

Apache Doris JDBC Catalog 支持通過標準 JDBC 接口連接 Oracle 數據庫。本文檔介紹如何配置 Oracle 數據庫連接。 使用須知? 要連接到 Oracle 數據庫&#xff0c;您需要 Oracle 19c, 18c, 12c, 11g 或 10g。 Oracle 數據庫的 JDBC 驅動程序&#xff0c;您可以從 Maven 倉庫…

im即時聊天客服系統SaaS還是私有化部署:成本、安全與定制化的權衡策略

隨著即時通訊技術的不斷發展&#xff0c;IM即時聊天客服系統已經成為企業與客戶溝通、解決問題、提升用戶體驗的重要工具。在選擇IM即時聊天客服系統時&#xff0c;企業面臨一個重要決策&#xff1a;選擇SaaS&#xff08;軟件即服務&#xff09;解決方案&#xff0c;還是進行私…

mysql中in和exists的區別?

大家好&#xff0c;我是鋒哥。今天分享關于【mysql中in和exists的區別?】面試題。希望對大家有幫助&#xff1b; mysql中in和exists的區別? 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 在 MySQL 中&#xff0c;IN 和 EXISTS 都用于進行子查詢&#xff0c;但它…

element-plus中table組件的使用

1、table組件的基本使用 注意&#xff1a; ①對象集合&#xff0c;要從后端查詢。 ②prop是集合中的對象的屬性名&#xff1b;label是表格表頭的名稱。 2、將性別一列的71轉為男&#xff0c;72轉為女 問題描述&#xff1a; 解決步驟&#xff1a; ①將el-table-column變成雙標簽…

Django小白級開發入門

1、Django概述 Django是一個開放源代碼的Web應用框架&#xff0c;由Python寫成。采用了MTV的框架模式&#xff0c;即模型M&#xff0c;視圖V和模版T。 Django 框架的核心組件有&#xff1a; 用于創建模型的對象關系映射為最終用戶設計較好的管理界面URL 設計設計者友好的模板…

使用 display: flex 實現動態布局:每行兩個 item,單數時最后一個占滿整行

文章目錄 使用 display: flex 實現動態布局&#xff1a;每行兩個 item&#xff0c;單數時最后一個占滿整行 &#x1f3af;一、需求分析二、實現思路三、代碼實現1. HTML 結構2. CSS 樣式關鍵點解析&#xff1a; 四、效果演示HTML 示例&#xff1a;效果&#xff1a; 五、完整代碼…

preloaded-classes裁剪

系統預加載了哪些class類&#xff1f;system/etc/preloaded-classes 修改源代碼&#xff1f; frameworks\base\config\preloaded-classes 默認位置&#xff0c;如果改了不生效&#xff0c;可能有其它模塊的mk文件指定了preloaded-classes覆蓋了framework模塊&#xff0c;例如…

華為配置篇-OSPF基礎實驗

OSPF 一、簡述二、常用命令總結三、實驗3.1 OSPF單區域3.2 OSPF多區域3.3 OSPF 的鄰接關系和 LSA 置底 一、簡述 OSPF&#xff08;開放式最短路徑優先協議&#xff09; 基本定義 全稱&#xff1a;Open Shortest Path First 類型&#xff1a;鏈路狀態路由協議&#xff08;IGP&…