第一篇:如何在數組中操作數據【數據結構入門】

記錄以下自己重溫數據結構的筆記,附帶自己實現的C代碼,
其中部分Python代碼是網上教程里的,順手粘貼過來,做一對比/
(Python確實簡潔,但是C更好理解不是嗎哈哈哈)

數組的定義

數組:線性表數據結構,利用一段連續的內存空間,存儲相同類型的數據
數組中的每個元素有唯一的下標索引
兩個角度理解數組:線性表結構,連續的內存空間,本質:采用順序存儲結構的線性表

隨機訪問數據元素

數組最顯著的特點:支持隨機訪問,就是通過下標直接定位并訪問任意一個元素
本質:第一個元素地址為首地址,每個元素都有唯一的下標和對應的內存地址,訪問數組元素時,利用下標通過尋址公式快速計算出目標元素的內存地址,實現高效訪問
尋址公式:下標 i 的元素地址 = 首地址 + i × 單個元素占用的字節數

多維數組

一般由m行n列的數據元素組成,本質上可理解為數組的數組,每個元素本身也是一個數組。
第一維表示行,第二維表示列。內存中,二維數組通常采用行優先或列優先的存儲方式。
二維數組常被視為矩陣,可用于處理如矩陣轉置、矩陣加法、矩陣乘法等問題。

數組在不同編程語言中的實現

不同編程語言中的數據實現存在一定差異。
C/C++中的數組最貼合其定義:他們使用一塊連續的內存空間來存儲相同類型的數據元素。
無論是基本數據類型,還是結構體、對象,在數組中都以連續方式排列。

int arr[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};

Java中的數組類似于C,但在多維數組的情況下,其允許創建不規則數組,即每個嵌套數組的長度可以不同。

int[][] arr = new int[3][];
arr[0] = new int[]{1, 2, 3};
arr[1] = new int[]{4, 5};
arr[2] = new int[]{6, 7, 8, 9};

Python使用“列表”這種容器類型,類似于Java中的ArrayList,通常將其作為數組使用,與傳統數組不同的是,Python不僅可以存儲不同類型的數據元素,長度也可以動態變化,并且支持豐富的內置方法。

arr = ['python', 'java', ['asp', 'php'], 'c']

數組的幾種基本操作

基本上,數組的操作主要涉及“增刪改查”四類,掌握這個就可以說掌握了數組的具體應用

訪問元素

假設我們要訪問數組中第 i 個元素:

  1. 首先檢查下標 i 是否在合法范圍內,即 0 ≤ i ≤ len(nums)-1,超出該范圍屬于非法訪問
  2. 如果下標合法,則可直接通過下標獲取對應元素的值
  3. 如果下標不合法,則拋出異常或返回特殊值
  4. 訪問數組元素不依賴于數組元素個數,因此其時間復雜度為O(1)
  5. C語言不會在訪問時檢查數組下標是否越界,因此編程者必須自己確保索引在有效范圍內
int arr[10] = {1, 2, 3, 4, 56, 7, 89, 999};int main() {printf("the first number is %d\n", arr[3]);arr[3] = 8;printf("the second number is %d\n", arr[3]);return 0;
}
// 從數組 nums 中讀取下標為 i 的數據元素值
def get_element(nums: list[int], index: int):"""獲取數組中指定下標的元素值"""if 0 <= index < len(nums):return nums[index]else:raise IndexError(f"數組下標 {index} 超出范圍 [0, {len(nums)-1}]")//示例用法
arr = [0, 5, 2, 3, 7, 1, 6]
print(get_element(arr, 3))  # 輸出: 3

查找元素

查找數組中元素值為 val 的位置

  1. 遍歷數組,將目標值與每個元素進行比較
  2. 找到匹配元素時返回其下標
  3. 遍歷完未找到時返回特殊值
  4. 當數組無序時,查找元素只能通過將 val 與數組中的每個元素依次比較,這種方式稱為線性查找。由于需要遍歷整個數組,線性查找的時間復雜度為O(n)
int arrfind(int nums[], int size, int val) {for (int i = 0; i < size; i++) {if(nums[i] == val){return i;}}return -1;
}int arr[] = {1, 2, 3, 4, 56, 7, 89, 999};int main() {// 查找數組元素int arr_size = sizeof(arr);// sizeof(arr[0]);// 在arr數組中尋找元素3int i1 = arrfind(arr,arr_size,3);printf("num 5 index is: %d\n",i1);// 在arr數組中尋找元素15int i2 = arrfind(arr,arr_size,15);printf("num 15 index is: %d\n",i2);return 0;
}
def find_element(nums: list[int], val: int):"""查找數組中元素值為 val 的位置"""for i in range(len(nums)):if nums[i] == val:return ireturn -1示例用法
arr = [0, 5, 2, 3, 7, 1, 6]
print(find_element(arr, 5))  # 輸出: 1
print(find_element(arr, 9))  # 輸出: -1 (未找到)

插入元素

在數組的第 i 個位置插入值 val

  1. 檢查 i 是否在數組范圍之內
  2. 拓展數組長度,為新元素騰出空間
  3. 將 i 及其之后的元素整體向后移動一位
  4. 在 i 位置插入 val
bool insert_element(int arr[], int *currentSize, int maxSize, int index, int val) {// 檢查索引是否有效:必須在 0 到 currentSize 之間(含)// 注意:可以在末尾插入,即 index == *currentSizeif (index < 0 || index > *currentSize) {printf("錯誤:插入索引 %d 越界!有效范圍是 [0, %d]\n", index, *currentSize);return false;}// 檢查數組是否已滿if (*currentSize >= maxSize) {printf("錯誤:數組已滿,無法插入新元素!\n");return false;}// 【關鍵步驟】 從最后一個元素開始,逐個向后移動,為新元素騰出空間for (int i = *currentSize - 1; i >= index; i--) {arr[i + 1] = arr[i];}// 在指定位置插入新值arr[index] = val;// 更新數組的實際大小(*currentSize)++;return true;
}

改變元素

將數組中的第 i 個元素改為 val

  1. 檢查 i 是否在數組長度之內
  2. 將第 i 個元素值賦值為 val
// 改變數組指定的元素值
bool change_array(int arr[], int size, int index, int val)
{if (index < 0 || index >= size) {printf("錯誤:賦值索引 %d 越界!有效范圍是 [0, %d]\n", index, size);return false;}arr[index] = val;return true;
}

刪除元素

刪除數組中指定 i 位置的元素

  1. 檢查下標 i 是否在合法的范圍內
  2. 將 i + 1 位置及其之后的元素整體向前移動一位
  3. 刪除最后一個元素(或更新數組長度)
  4. 刪除元素需要移動后續元素,移動次數與數組長度有關,因此時間復雜度為O(n)
/*** 刪除數組中指定索引位置的元素* @param arr: 目標數組* @param currentSize: 指向當前數組元素個數的指針(函數會修改它)* @param index: 要刪除的元素索引* @return: 成功返回 true,失敗(索引越界)返回 false*/
bool delete_element(int arr[], int *currentSize, int index) {// 檢查索引是否有效:必須在 [0, currentSize - 1] 范圍內if (index < 0 || index >= *currentSize) {printf("錯誤:刪除索引 %d 越界!有效范圍是 [0, %d)\n", index, *currentSize);return false;}// 從 index + 1 開始,將每個元素向前移動一位for (int i = index; i < *currentSize - 1; i++) {arr[i] = arr[i + 1];}// 邏輯上減少數組大小(*currentSize)--;return true;
}

總結

數組采用連續的內存空間來存儲相同類型的數據,其優勢在于支持隨機訪問,可以通過下標高效定位和訪問任意元素
數組的訪問和修改操作時間復雜度為時間復雜度為O(1),而插入和刪除操作需要移動元素,時間復雜度為O(n)
這部分內容需要掌握的是邏輯(其實概括一下都是先校驗索引范圍,再操作數據,最后打印出來展示,三步走),具體的實現比較簡單,實際應用中更應關注函數、指針等細節方面

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

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

相關文章

基于STM32的單片機開發復盤

硬件介紹 底盤&#xff1a;幻爾阿克曼底盤&#xff1b;2個直流霍爾電機、1個PWM舵機開發板&#xff1a;幻爾Ros Controller V1.2&#xff08;STM32F407VET6&#xff09;電源&#xff1a;因為是學習階段&#xff0c;沒有配電池&#xff0c;使用120W可調電源&#xff08;3V~12V&a…

面試常問:注冊中心宕機,遠程調用還能成功嗎?

在微服務架構里&#xff0c;注冊中心&#xff08;像 Nacos、Eureka、Consul 等&#xff09;是服務發現與治理的核心。可要是注冊中心突然宕機&#xff0c;微服務間的遠程調用還能順利進行嗎&#xff1f;這是面試時很常被問到的問題&#xff0c;下面我們就來深入剖析。一、遠程調…

《用 Python 和 Matplotlib 繪制折線圖:從入門到實戰的可視化指南》

《用 Python 和 Matplotlib 繪制折線圖:從入門到實戰的可視化指南》 一、引言:數據可視化的力量,從一張折線圖開始 在我多年的開發與教學經歷中,最常被問到的問題之一是:“如何讓數據更直觀?”我的答案始終如一:用圖說話。而在眾多圖表類型中,折線圖以其簡潔、清晰的…

Seate的XA模式和AT模式

目錄 一、XA模式 【1】兩階段提交 【2】Seata的XA模型 【3】優缺點 【4】實現XA模式 二、AT模式 【1】Seata的AT模型 【2】AT與XA的區別 【3】臟寫問題 【4】優缺點 【5】實現AT模式 一、XA模式 XA 規范 是 X/Open 組織定義的分布式事務處理&#xff08;DTP&#xf…

CTFHub SSRF通關筆記6:Gopher Redis原理詳解與滲透實戰

目錄 一、SSRF Gopher Redis 1、功能簡介 2、攻擊原理 &#xff08;1&#xff09;SSR的作用 &#xff08;2&#xff09;Gopher 協議特性 &#xff08;3&#xff09;攻擊 Redis 步驟 二、gopherus 1、功能簡介 2、攻擊Redis服務方法 三、Gopherus安裝 1、源碼下載 2…

數據結構之二叉樹(2)

數據結構之二叉樹&#xff08;2&#xff09;1.二叉樹的存儲結構2.實現順序結構二叉樹2.1何為堆2.2堆的性質2.3堆的定義2.3堆的初始化與銷毀3.1向上調整算法3.2向下調整算法4.入堆5.出堆讓花成花&#xff0c;讓樹成樹上一次我們學習了樹的分類&#xff0c;并初步了解了二叉樹。今…

Linux操作系統之Ubuntu

Ubuntu是基于Debian的開源Linux發行版&#xff0c;由Canonical公司維護&#xff0c;以用戶友好性和穩定性著稱。它廣泛應用于個人電腦、服務器及云計算環境&#xff0c;支持多種硬件架構。Ubuntu的特點Ubuntu提供定期更新版本&#xff08;每6個月&#xff09;和長期支持版本&am…

kotlin的函數前面增加suspend關鍵字的作用

deepseek回答&#xff1a; Kotlin中suspend關鍵字的作用詳解 核心作用 suspend關鍵字用于標記?掛起函數?&#xff0c;使其能夠在協程中實現非阻塞的異步操作。 suspend關鍵字的本質作用 suspend關鍵字的主要作用是?標記一個函數為掛起函數?&#xff0c;使其能夠在協程中使用…

Vibe Coding實戰項目:用Qwen3-Coder做了個AI跳舞視頻生成器

大家好&#xff0c;這里是K姐。 一個 Vibe Coding 的探索者。 前段時間發現通義發起了一個Qwen3-Coder挑戰賽&#xff0c;最高獎金有10000元&#xff0c;研究了一下&#xff0c;我發現這個賽道太寬了&#xff0c;不限項目&#xff0c;用 AI Coding 做數據分析、個人Blog、抓取…

Kafka面試精講 Day 13:故障檢測與自動恢復

【Kafka面試精講 Day 13】故障檢測與自動恢復 在“Kafka面試精講”系列的第13天&#xff0c;我們將深入探討 Kafka 高可用體系中的關鍵一環&#xff1a;故障檢測與自動恢復機制。作為分布式系統的核心能力&#xff0c;Kafka 如何在 Broker 宕機、網絡分區或磁盤故障時快速感知…

【前沿技術拓展Trip Two】具身智能

具身智能&#xff08;Embodied AI&#xff09;的認識&#xff0c;進展&#xff0c;以及為何難以實現 在講具身智能之前&#xff0c;我們不得不先行介紹一下離身智能與離身認識系統這兩個極其相關且更加常見的概念 離身認識系統 其實目前絕大多數的AI&#xff0c;例如DeepSeek&a…

使用electron將vue3網頁項目包裝成pc客戶端

一、準備前工作在項目的根目錄 打開命令行工具 安裝四個依賴庫安裝報錯的話二、準備工作完成之后&#xff0c;在項目根目錄需要有倆個文件在項目根目錄創建electron文件夾在vite.config.js中添加配置項在package.json中添加配置項運行命令 npm run electron:build 打包關于mac&…

基于安全抽象模型(SAM)的汽車網絡安全防御與攻擊分析

摘要自動駕駛汽車比以往任何一種個人出行交通工具都具有更大的受攻擊可能性。這主要是因為這類汽車對通信有極高的需求&#xff0c;一方面是出于功能和安全方面的考慮&#xff0c;另一方面則是為了滿足舒適性需求。無人駕駛汽車需要與周圍環境進行通信的接口、直接連接&#xf…

線掃相機不出圖原因總結

1、幀觸發信號有問題 線掃相機出圖由幀信號決定開始采集,如果沒有幀信號線掃相機無法識別開始信號,所以不出圖 1)沒有給相機幀信號 幀信號是一個短暫的脈沖信號,持續時間不要太長,相機能識別就可以,一般由plc或者控制卡的數字量輸出口觸發,可以通過監測數字量輸出口來確…

開發避坑指南(46):Java Stream 對List的BigDecimal字段進行求和

需求 對int&#xff0c;long類型的數據求和直接用stream().mapToInt()、stream().mapToDouble()&#xff0c;可是沒有stream().mapToBigDecimal()這樣的方法&#xff0c;那么如何用stream對List的BigDecimal字段進行求和&#xff1f; 代碼實現 直接上代碼 public class OrderIn…

pycharm如何處理python項目間引用

1. 如何在pycharm中將其它項目添加到打開的項目中 如圖所示&#xff1a;文件->打開->附加&#xff08;Attach&#xff09;即可2.如何引用:直接作為一個普通package引用即可 from attack_projectxxx.modulexxx import xxx3.pyinstaller如何編譯這種引用其它項目的可執行文…

家庭勞務機器人發展階段與時間預測

家庭勞務機器人大規模進入家庭不會是一個單一的時間點&#xff0c;而是一個分階段、漸進式的過程。我們可以將這個進程分為以下幾個階段&#xff0c;并對每個階段的時間線進行預測&#xff1a;第一階段&#xff1a;單一功能機器人普及&#xff08;現在 - 2025年&#xff09;這個…

Zynq開發實踐(FPGA之spi實現)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】雖然串口用的地方比較多&#xff0c;實現起來也比較簡單。但是串口本身速度比較慢&#xff0c;不利于高速數據通信。而且單個串口沒有辦法和很多芯片…

指甲打磨機/磨甲器MCU控制方案開發,輕松解決磨甲問題

美甲打磨機/指甲打磨機核心功能需求 1. 基礎功能 無級調速(5,000-30,000 RPM&#xff0c;PWM控制) 正反轉切換&#xff08;可選&#xff0c;用于拋光/去角質&#xff09; 按鍵鎖/防誤觸&#xff08;長按3秒解鎖&#xff09; 鋰電池管理&#xff08;3.7V單節&#xff0c;帶充電指…

臨床數據挖掘與分析:利用GPU加速Pandas和Scikit-learn處理大規模數據集

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 摘要 隨著電子健康記錄&#xff08;EHR&#xff09;的普…