順序表——C語言

順序表實現代碼解析與學習筆記

一、順序表基礎概念

順序表是線性表的一種順序存儲結構,它使用一段連續的內存空間(數組)存儲數據元素,通過下標直接訪問元素,具有隨機訪問的特性。其核心特點是:元素在內存中連續存放,邏輯順序與物理順序一致。

二、代碼結構說明

本次實現包含 3 個文件,分工如下:

  • arraylist.h:定義順序表結構體及相關操作函數的聲明

  • arraylist.c:實現順序表的核心操作函數

  • main.c:測試順序表的各項功能

三、核心結構體解析

arraylist.h中定義了順序表的結構體:

typedef struct{?int capacity; ?  // 順序表的容量(最大可存儲元素數)?int last; ? ? ?  // 最后一個元素的下標(-1表示空表)?int \*data; ? ? ? // 指向存儲元素的數組(堆內存)?} ArrayList;

  • capacity:記錄當前順序表的最大容量(數組長度)

  • last:通過下標管理實際元素數量(元素個數 = last + 1)

  • data:動態數組指針,實際存儲元素的內存空間

四、核心函數實現解析

1. 初始化函數 init_list

?ArrayList \*init\_list(int cap) {?if (cap <= 0) return NULL;  // 容量必須為正數?ArrayList \*list = malloc(sizeof(ArrayList));?if (list) {?list->data = calloc(cap, sizeof(int));  // 分配數組內存并初始化為0?if (list->data == NULL) {?free(list);  // 數組內存分配失敗時,釋放結構體?return NULL;?}?list->capacity = cap;?list->last = -1;  // 初始化為空表?return list;?}?return NULL;?}

  • 功能:創建并初始化順序表,分配結構體和數組內存

  • 關鍵:參數校驗(容量 > 0)、內存分配失敗的容錯處理

2. 插入函數 insert(頭插法)

?bool insert(ArrayList \*list, int data) {?if (list == NULL) return false;?// 滿表時擴容(2倍擴容)?if (is\_full(list) && !expand\_list(list)) return false;?// 元素后移(從最后一個元素開始)?for (int i = list->last; i >= 0; i--) {?list->data\[i+1] = list->data\[i];?}?// 插入新元素到表頭(下標0)?list->data\[0] = data;?list->last++;  // 更新最后元素下標?return true;?}

  • 特點:采用頭插法(新元素插入到表頭位置)

  • 擴容邏輯:當表滿時調用expand_list擴容為原容量的 2 倍

  • 時間復雜度:O (n)(需要移動所有現有元素)

3. 擴容函數 expand_list(靜態輔助函數)

?static bool expand\_list(ArrayList \*list) {?if (list == NULL) return false;?int new\_cap = list->capacity \* 2;  // 2倍擴容策略?int \*new\_data = realloc(list->data, sizeof(int) \* new\_cap);?if (new\_data == NULL) return false;?list->data = new\_data;?list->capacity = new\_cap;?// 初始化新增內存(可選操作)?for (int i = list->last + 1; i < new\_cap; i++) {?list->data\[i] = 0;?}?return true;?}

  • 關鍵:使用realloc重新分配內存,避免內存泄漏

  • 擴容策略:簡單采用 2 倍擴容(實際應用中可根據需求優化,如 1.5 倍擴容減少內存浪費)

4. 刪除函數 remove_data

?bool remove\_data(ArrayList \*list, int data) {?if (!list || is\_empty(list)) return false;?// 查找第一個匹配元素的位置?int pos = -1;?for (int i = 0; i <= list->last; i++) {?if (list->data\[i] == data) {?pos = i;?break;?}?}?if (pos == -1) return false;  // 未找到元素?// 元素前移(覆蓋被刪除元素)?for (int i = pos; i < list->last; i++) {?list->data\[i] = list->data\[i+1];?}?list->last--;  // 更新最后元素下標?return true;?}

  • 功能:刪除第一個匹配的元素

  • 步驟:查找位置 → 元素前移 → 更新下標

  • 時間復雜度:O (n)(最壞情況需要移動 n-1 個元素)

5. 銷毀函數 destroy

?void destroy(ArrayList \*list) {?if (list == NULL) return;?if (list->data != NULL) {?free(list->data);  // 先釋放數組內存?list->data = NULL;  // 避免懸掛指針?}?free(list);  // 再釋放結構體內存?list = NULL;?}

  • 關鍵:先釋放內部動態數組,再釋放結構體,避免內存泄漏

  • 注意:置空指針(list->data = NULL)防止后續誤操作

五、測試流程解析(main.c)

  1. 初始化順序表:創建容量為 3 的順序表

  2. 測試插入功能:插入 5 個數據(10、20、30、40、50)

  • 插入前 3 個數據時,容量為 3(未擴容)

  • 插入第 4 個數據時,表滿觸發擴容(容量變為 6)

  1. 遍歷輸出:打印當前順序表的所有元素(頭插法下,元素順序為 50、40、30、20、10)

  2. 測試刪除功能:依次刪除 30、10、50、12(12 不存在)

  3. 銷毀順序表:釋放所有分配的內存

六、學習筆記總結

  1. 順序表優缺點

  • 優點:隨機訪問(通過下標直接訪問,時間復雜度 O (1))

  • 缺點:插入 / 刪除中間元素時需要移動大量元素(時間復雜度 O (n));容量固定(需手動擴容)

  1. 頭插法特點

  • 新元素始終插入到表頭,插入順序與元素存儲順序相反(如插入 10→20→30,存儲為 30、20、10)

  • 每次插入都需移動所有現有元素,適合元素數量少的場景

  1. 擴容策略思考

  • 2 倍擴容:減少擴容次數,但可能浪費內存

  • 1.5 倍擴容:平衡擴容次數和內存浪費,更適合實際應用

  • 擴容時使用realloc,可能觸發內存拷貝(原有內存不足時)

  1. 內存管理要點

  • 動態內存分配后必須檢查是否成功(NULL判斷)

  • 釋放內存時需先釋放內部資源(如data數組),再釋放外部結構體

  • 釋放后指針置空,避免懸掛指針導致的野指針操作

通過以上代碼實現,可以清晰理解順序表的基本操作原理及內存管理細節,為學習更復雜的數據結構奠定基礎。

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

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

相關文章

【Oracle篇】Oracle Data Pump遠程備份技術:直接從遠端數據庫備份至本地環境

&#x1f4ab;《博主主頁》&#xff1a;    &#x1f50e; CSDN主頁__奈斯DB    &#x1f50e; IF Club社區主頁__奈斯、 &#x1f525;《擅長領域》&#xff1a;擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控&#xff1b;并對…

Linux系統--文件系統

大家好&#xff0c;我們今天繼續來學習Linux系統部分。上一次我們學習了內存級的文件&#xff0c;下面我們來學習磁盤級的文件。那么話不多說&#xff0c;我們開始今天的學習&#xff1a; 目錄 Ext系列?件系統 1. 理解硬件 1-1 磁盤、服務器、機柜、機房 1-2 磁盤物理結構…

KUKA庫卡焊接機器人氬氣節氣設備

在焊接生產過程中&#xff0c;氬氣作為一種重要的保護氣體被廣泛應用于KUKA庫卡焊接機器人的焊接操作中。氬氣的消耗往往是企業生產成本的一個重要組成部分&#xff0c;因此實現庫卡焊接機器人節氣具有重要的經濟和環保意義。WGFACS節氣裝置的出現為解決這一問題提供了有效的方…

遠程連接----ubuntu ,rocky 等Linux系統,WindTerm_2.7.0

新一代開源免費的終端工具-WindTerm github 27.5k? https://github.com/kingToolbox/WindTerm/releases/download/2.7.0/WindTerm_2.7.0_Windows_Portable_x86_64.zip 主機填寫你自己要連接的主機ip 端口默認 22 改成你ssh文件配置的端口 輸入遠程的 用戶名 與密碼 成功連接…

筆試——Day32

文章目錄第一題題目思路代碼第二題題目&#xff1a;思路代碼第三題題目&#xff1a;思路代碼第一題 題目 素數回文 思路 模擬 構建新的數字&#xff0c;判斷該數是否為素數 代碼 第二題 題目&#xff1a; 活動安排 思路 區間問題的貪?&#xff1a;排序&#xff0c;然…

超高車輛如何影響城市立交隧道安全?預警系統如何應對?

超高車輛對立交隧道安全的潛在威脅在城市立交和隧道中&#xff0c;限高設施的設計通常考慮到大部分正常通行的貨車和運輸車輛。然而&#xff0c;一些超高的貨車、集裝箱車或特殊車輛如果未經有效監測而進入限高區域&#xff0c;就可能對道路設施造成極大的安全隱患。尤其在立交…

解決 MinIO 上傳文件時報 S3 API Requests must be made to API port錯誤

在使用 MinIO 進行文件上傳時&#xff0c;我遇到了一個比較坑的問題。錯誤日志如下&#xff1a; io.minio.errors.InvalidResponseException: Non-XML response from server. Response code: 400, Content-Type: text/xml; charsetutf-8, body: <?xml version"1.0&quo…

linux_https,udp,tcp協議(更新中)

目錄 https 加密類型 對稱加密 非對稱加密 加密方案 只用對程加密 只用非對程加密 雙方都是用非對程加密 非對稱對稱加密 非對稱對稱加密證書 流程圖 校驗流程圖 udp udp協議格式 特點 UDP緩沖區 tcp tcp協議格式 32位序號及確認序號 4位首部 6位標志位 1…

web端-登錄頁面驗證碼的實現(springboot+vue前后端分離)超詳細

目錄 一、項目技術棧 二、實現效果圖 ?三、實現路線 四、驗證碼的實現步驟 五、完整代碼 1.前端 2.后端 一、項目技術棧 登錄頁面暫時涉及到的技術棧如下: 前端 Vue2 Element UI Axios&#xff0c;后端 Spring Boot 2 MyBatis MySQL JWT Maven 二、實現效果圖…

瘋狂星期四文案網第33天運營日記

網站運營第33天&#xff0c;點擊觀站&#xff1a; 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 今日訪問量 今日搜索引擎收錄情況 必應收錄239個頁面&#xff0c;還在持續增加中&#xff0c;已經獲得必應的認可&#xff0c;逐漸收錄所有頁面 百度…

客戶端利用MinIO對服務器數據進行同步

MinIO 是一款高性能、開源的對象存儲服務&#xff0c;專為海量數據存儲設計&#xff0c;兼容 Amazon S3 API&#xff08;即與 AWS S3 協議兼容&#xff09;&#xff0c;可用于構建私有云存儲、企業級數據湖、備份歸檔系統等場景。它以輕量、靈活、高效為核心特點&#xff0c;廣…

WPF 雙擊行為實現詳解:DoubleClickBehavior 源碼分析與實戰指南

WPF 雙擊行為實現詳解:DoubleClickBehavior 源碼分析與實戰指南 文章目錄 WPF 雙擊行為實現詳解:DoubleClickBehavior 源碼分析與實戰指南 引言 一、行為(Behavior)基礎概念 1.1 什么是行為? 1.2 行為的優勢 二、DoubleClickBehavior 源碼分析 2.1 類定義與依賴屬性 2.2 雙…

零知開源——基于STM32F103RBT6的TDS水質監測儀數據校準和ST7789顯示實戰教程

?零知開源是一個真正屬于國人自己的開源軟硬件平臺&#xff0c;在開發效率上超越了Arduino平臺并且更加容易上手&#xff0c;大大降低了開發難度。零知開源在軟件方面提供了完整的學習教程和豐富示例代碼&#xff0c;讓不懂程序的工程師也能非常輕而易舉的搭建電路來創作產品&…

luogu P3387 【模板】縮點

原題鏈接 原題再現 題目描述 給定一個 n 個點 m 條邊有向圖&#xff0c;每個點有一個權值&#xff0c;求一條路徑&#xff0c;使路徑經過的點權值之和最大。你只需要求出這個權值和。 允許多次經過一條邊或者一個點&#xff0c;但是&#xff0c;重復經過的點&#xff0c;權…

P1119 災后重建【題解】

P1119 災后重建 題目背景 B 地區在地震過后&#xff0c;所有村莊都造成了一定的損毀&#xff0c;而這場地震卻沒對公路造成什么影響。但是在村莊重建好之前&#xff0c;所有與未重建完成的村莊的公路均無法通車。換句話說&#xff0c;只有連接著兩個重建完成的村莊的公路才能通…

Horse3D引擎研發筆記(二):基于QtOpenGL使用仿Three.js的BufferAttribute結構重構三角形繪制

在Horse3D引擎的研發過程中&#xff0c;我們致力于構建一個高效、靈活且易于擴展的3D圖形引擎。在本篇博客中&#xff0c;我們將詳細記錄如何基于QtOpenGL框架&#xff0c;使用仿Three.js的BufferAttribute結構&#xff0c;重構三角形繪制流程。通過這一過程&#xff0c;我們希…

MCU程序段的分類

程序的下載&#xff08;燒錄到存儲器中&#xff09;通常是按照程序文件分段&#xff08;Code段、RO_data段、RW_data段、ZI_data段&#xff09;的方式存儲的&#xff0c;但運行時內存的布局會按照程序進程分段&#xff08;TEXT段、DATA段、BSS段、堆棧段&#xff09;進行組織。…

綜合項目記錄:自動化備份全網服務器數據平臺

一、項目背景與需求1.1項目概述該項目共分為2個子項目&#xff0c;由環境搭建和實施備份兩部分組成1.2項目總體需求企業內部有一臺web服務器&#xff0c;內部數據很重要&#xff0c;現需要為該web服務器數據做備份&#xff0c;這樣在數據丟失時可以恢復。要求如下&#xff1a;每…

聯合索引全解析:一棵樹,撐起查詢的半邊天

目錄 一、為什么聯合索引是MySQL性能優化的“王牌”&#xff1f; &#xff08;一&#xff09;索引的基本結構&#xff1a;從聚簇到非聚簇 1. 聚簇索引&#xff08;Clustered Index&#xff09; 2. 非聚簇索引&#xff08;Secondary Index&#xff09; &#xff08;二&…

vue開發的計算機課程頁面

課程信息展示頁面設計與實現我將設計一個美觀且實用的課程信息展示頁面&#xff0c;重點展示計算機網絡應用課程的相關信息。設計思路使用卡片式布局清晰展示課程各模塊信息采用科技感配色方案&#xff0c;符合計算機網絡課程主題添加動畫效果增強用戶體驗響應式設計確保在各種…