數據結構——順序表的相關操作

一、順序表基礎認知?

1.順序表的定義與特點?

順序表是數據結構中一種線性存儲結構,它將數據元素按照邏輯順序依次存儲在一片連續的物理內存空間中。簡單來說,就是用一段地址連續的存儲單元依次存放線性表的元素,且元素之間的邏輯關系通過物理位置的相鄰關系直接體現。?

其核心特點包括:?

  • 物理存儲連續:所有元素在內存中占據連續的存儲空間,例如第 i 個元素的存儲地址可通過首地址和元素大小計算(Loc (ai) = Loc (a0) + i×sizeof (元素類型))。?

  • 元素訪問高效:支持隨機訪問,即通過下標可以直接定位到目標元素,時間復雜度為 O (1)。?

  • 容量固定或動態調整:靜態順序表的容量在初始化時確定,動態順序表則可根據元素數量動態擴容或縮容。?

  • 插入刪除效率低:若在中間位置插入或刪除元素,需要移動大量后續元素以維持連續性,時間復雜度為 O (n)。

2.順序表與數組的關聯和區別?

順序表與數組密切相關,但二者并非完全等同,具體關聯和區別如下:?

關聯:?

  • 順序表的底層實現依賴數組:無論是靜態還是動態順序表,都會借助數組作為物理存儲載體,利用數組的連續內存特性實現元素的線性排列。?

  • 元素訪問方式一致:兩者都支持通過下標直接訪問元素,遵循 “隨機訪問” 的特性。

區別:

例如,在 C 語言中,數組是int arr[10]這樣的固定大小容器,而順序表則會通過結構體封裝數組指針、當前長度和容量,如:?

typedef struct {int* data;   // 指向數組的指針int size;    // 當前元素個數int capacity; // 容量
} SeqList;

二、順序表的初始化操作?

//1.初始化
void InitSeqList(SeqList* plist)
{//斷言assert(plist != NULL);//1.給指針malloc分配內存ELEM_TYPE* p = (ELEM_TYPE*)malloc(sizeof(ELEM_TYPE) * SXQ_INIT_SIZE);if (NULL == p){printf("初始化malooc分配內存失敗\n");return;}plist->arr = p;//2.個數plist->cursize = 0;//3.容量plist->capacity = SXQ_INIT_SIZE;
}

三、順序表的核心操作?

1.插入元素(頭部、中間、尾部)

//7.插入元素
bool InsertElem(SeqList* plist, int pos, ELEM_TYPE val)
{assert(plist != NULL);if (IsFull(plist)){if (IncMem(plist) == false){printf("無法插入\n");return false;}}if (pos<0 || pos>plist->cursize){printf("插入位置不合法\n");return false;}for (int i = plist->cursize - 1; i >= pos; i--){plist->arr[i + 1] = plist->arr[i];}plist->arr[pos] = val;plist->cursize += 1;return true;
}//8.尾插
bool Push_Back(SeqList* plist, ELEM_TYPE val)
{assert(plist != NULL);plist->arr[plist->cursize] = val;plist->cursize++;return true;
}//9.頭插
bool Push_Front(SeqList* plist, ELEM_TYPE val)
{assert(plist != NULL);InsertElem(plist, 0, val);return true;
}

2.?刪除元素(指定位置、指定值)?

//12.按位置刪除
bool ErasePos(SeqList* plist, int index)
{assert(plist != NULL);if (IsEmpty(plist)){printf("刪除失敗\n");return false;}if (index<0 || index>plist->cursize){printf("刪除失敗\n");return false;}for (int i = index; i < plist->cursize; i++){plist->arr[i] = plist->arr[i + 1];}plist->cursize -= 1;return true;
}//13.按值刪除(刪一次)
bool RemoveElem(SeqList* plist, ELEM_TYPE val)
{assert(plist != NULL);for (int i = 0; i < plist->cursize; i++){if (val == plist->arr[i]){ErasePos(plist, i);}}return true;
}//14.按值刪除(刪多次)
bool RemoveElemAll(SeqList* plist, ELEM_TYPE val)
{assert(plist != NULL);int i = 0;while (i < plist->cursize){if (plist->arr[i] == val){ErasePos(plist, i);}else{i++;}}return true;
}//15.刪除尾
bool Pop_Back(SeqList* plist)
{assert(plist != NULL);if (IsEmpty(plist)){return false;}ErasePos(plist, plist->cursize - 1);return true;
}//16.刪除頭
bool Pop_Front(SeqList* plist)
{assert(plist != NULL);if (IsEmpty(plist)){return false;}ErasePos(plist, 0);return true;
}

3.查找元素(按值查找、按位查找)

//11.查詢
int FindValue(const SeqList* plist, ELEM_TYPE val)//沒找到返回-1,找到了返回下標,有多個返回第一個
{assert(plist != NULL);if (IsEmpty(plist)){return -1;}for (int i = 0; i < plist->cursize; i++){if (plist->arr[i] == val){printf("找到了,下標為%d\n", i);return i;}}return -1;
}

四、順序表的銷毀操作?

//22.清除順序表
bool ClearElem(SeqList* plist)
{assert(plist != NULL);plist->cursize = 0;return true;
}//23.銷毀
void DestroySeqList(SeqList* plist)
{assert(plist != NULL);free(plist->arr);plist->arr = NULL;plist->cursize = 0;plist->capacity = 0;
}

五、反轉、合并兩個有序的順序表

//24.反轉順序表
void Reverse_List(SeqList* plist)
{assert(plist != NULL);if (IsEmpty(plist)){return;}int left = 0;int right = plist->cursize - 1;while (left < right){int temp = plist->arr[left];plist->arr[left] = plist->arr[right];plist->arr[right] = temp;left++;right--;}
}//25.合并兩個有序的順序表
void Merge_List(SeqList* plist1, SeqList* plist2, SeqList* plist3)
{assert(plist1 != NULL && plist2 != NULL && plist3 != NULL);int i = 0, j = 0;while (i < plist1->cursize || j < plist2->cursize){if (plist1->arr[i] > plist2->arr[j]){Push_Back(plist3, plist2->arr[j]);j++;}else{Push_Back(plist3, plist1->arr[i]);i++;}if (i == plist1->cursize){while (j < plist2->cursize){Push_Back(plist3, plist2->arr[j]);j++;}}if (j == plist2->cursize){while (i < plist1->cursize){Push_Back(plist3, plist1->arr[i]);i++;}}}}

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

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

相關文章

2025最新國產用例管理工具評測:Gitee Test、禪道、藍凌測試、TestOps 哪家更懂研發協同?

在快節奏的 DevOps 時代&#xff0c;測試用例管理已不再是 QA 的獨角戲&#xff0c;而是穿透需求—開發—測試—交付全流程的核心樞紐。想象一下&#xff0c;如果用例結構混亂&#xff0c;覆蓋不全&#xff0c;甚至丟失版本變更歷史&#xff0c;不僅協作亂&#xff0c;還影響交…

在線評測系統開發交流

https://space.bilibili.com/700332132?spm_id_from333.788.0.0 實驗內容爬蟲Web系統設計數據分析實驗指導爬蟲Web系統設計自然語言處理與信息檢索數據可視化評分標準FAQ實驗二&#xff1a;在線評測系統實驗概述實驗內容Step1&#xff1a;題目管理Step2&#xff1a;題目評測S…

Linux操作系統從入門到實戰(十)Linux開發工具(下)make/Makefile的推導過程與擴展語法

Linux操作系統從入門到實戰&#xff08;十&#xff09;Linux開發工具&#xff08;下&#xff09;make/Makefile的推導過程與擴展語法前言一、 make/Makefile的推導過程1. 先看一個完整的Makefile示例2. make的工作流程&#xff08;1&#xff09;尋找Makefile文件&#xff08;2&…

NFS磁盤共享

步驟&#xff1a;注意事項?&#xff1a;確保服務端防火墻關閉&#xff0c;或者允許2049端口通信&#xff0c;客戶端需具備讀寫權限。服務器端安裝NFS服務器&#xff1a;sudo apt-get install nfs-kernel-server # Debian/Ubuntu sudo yum install nfs-utils # Ce…

ORA-06413: 連接未打開

System.Data.OracleClient.OracleException:ORA-06413: 連接未打開 oracle 報錯 ORA-06413: 連接未打開 db.Open();的報錯鏈接未打開&#xff0c;System.Data.OracleClient.OracleException HResult0x80131938 MessageORA-06413: 連接未打開 關于ORA-06413錯誤&#xff08;…

【PCIe 總線及設備入門學習專欄 5.1.2 -- PCIe EP core_rst_n 與 app_rst_n】

文章目錄 app_rst_n 和 core_rst_n 的作用1. core_rst_n — PCIe 控制器內部邏輯復位作用控制方式2. app_rst_n — 應用層/用戶邏輯復位作用特點兩者關系圖示:示例流程(Synopsys EP)rst_sync[3] 的作用詳解(復位同步邏輯)為什么使用 rst_sync[3]?圖示說明Synopsys 官方手…

Python初學者筆記第二十期 -- (文件IO)

第29節課 文件IO 在編程中&#xff0c;文件 I/O&#xff08;輸入/輸出&#xff09;允許程序與外部文件進行數據交互。Python 提供了豐富且易用的文件 I/O 操作方法&#xff0c;能讓開發者輕松實現文件的讀取、寫入和修改等操作。 IO交互方向 從硬盤文件 -> 讀取數據 -> 內…

Java JUC包概述

Java 的 java.util.concurrent&#xff08;簡稱 JUC&#xff09;包是 JDK 5 及以后引入的并發編程工具包&#xff0c;旨在解決傳統線程模型&#xff08;如 synchronized、wait/notify&#xff09;的局限性&#xff0c;提供更靈活、高效、可擴展的并發編程組件。它極大簡化了多線…

LeetCode--44.通配符匹配

前言&#xff1a;不知不覺又斷更一天了&#xff0c;其實昨天就把這道題寫得差不多了&#xff0c;只是剛好在力扣里面看見了一種新的解法&#xff0c;本來想寫出來的&#xff0c;但是我把它推到今天了&#xff0c;因為太晚了&#xff0c;但是今天又睡懶覺了&#xff0c;所以我直…

WHAT - 依賴管理工具 CocoaPods

文章目錄1. 什么是 CocoaPods&#xff1f;2. 如何安裝 CocoaPods&#xff1f;(1) 確保已安裝 Ruby&#xff08;macOS 默認自帶&#xff09;(2) 安裝 CocoaPods(3) 驗證安裝3. 在 React Native 項目中使用 CocoaPods(1) 進入 iOS 目錄(2) 初始化 Podfile&#xff08;如果不存在&…

C++ Boost Aiso TCP 網絡聊天(服務端客戶端一體化)

代碼功能說明: 程序模式: 主動連接模式:當用戶指定對端 IP 和端口時,嘗試連接到對端被動監聽模式:當用戶未指定對端 IP 時,等待其他節點連接線程模型: 主線程:處理用戶輸入和消息發送接收線程:后臺接收并顯示對端消息關鍵組件: std::atomic<bool> connected:原…

WeakAuras 5.12.9 Ekkles lua

3.45獵人寶寶狼 技能恢復宏已知3.45BUG RL技能位會清空&#xff0c;小退大退 BB技能全部激活&#xff0c;修復以前可用宏一鍵恢復狀態-------方法一&#xff1a;宏命令---------------------------------------------------------#showtooltip 狂怒之嚎 /petautocaston [btn:1]…

對于編寫PID過程中的問題

當stm32RCT6使用位置環pid控制麥輪轉動一定路程時&#xff0c;在這個時間段內想讓一邊輪胎速度加大應該怎么做&#xff1f;比如我pid的目標脈沖值為9000&#xff0c;在運行到3000的時候車偏左了&#xff0c;那我應該怎樣讓他回正&#xff0c;我想到的辦法是增加其最大的脈沖值&…

LeetCode|Day13|88. 合并兩個有序數組|Python刷題筆記

LeetCode&#xff5c;Day13&#xff5c;88. 合并兩個有序數組&#xff5c;Python刷題筆記 &#x1f5d3;? 本文屬于【LeetCode 簡單題百日計劃】系列 &#x1f449; 點擊查看系列總目錄 >> &#x1f4cc; 題目簡介 題號&#xff1a;88. 合并兩個有序數組 難度&#xf…

【C++】初識C++(1)

個人主頁&#xff1a;我要成為c嘎嘎大王 希望這篇小小文章可以讓你有所收獲&#xff01; 目錄 前言 一、C的第一個程序 二、命名空間 2.1 namespace 的價值 2.2 namespace 的定義 2.2.1 正常的命名空間定義 2.2.2 命名空間可以嵌套 2.2.3 匿名命名空間 2.2.4 同名的name…

在新聞資訊 APP 中添加不同新聞分類頁面,通過 ViewPager2 實現滑動切換

在新聞資訊 APP 中添加不同新聞分類頁面&#xff0c;通過 ViewPager2 實現滑動切換 核心組件的作用 ViewPager2&#xff1a;是 ViewPager 的升級版&#xff0c;基于RecyclerView實現&#xff0c;支持水平 / 垂直滑動、RTL&#xff08;從右到左&#xff09;布局&#xff0c;且修…

vuex操作state為什么要使用mutations作為規范而不是直接修改state

1. 狀態變更的可追蹤性 (Trackable Changes)Devtools 集成&#xff1a;Vue Devtools 可以捕獲每次 mutation 的執行記錄&#xff0c;記錄變更前后的 state 快照、參數和調用棧。直接修改 state&#xff1a;Devtools 無法檢測到變更來源&#xff0c;導致調試困難&#xff08;如無…

Spring AI 系列之九 - RAG-入門

之前做個幾個大模型的應用&#xff0c;都是使用Python語言&#xff0c;后來有一個項目使用了Java&#xff0c;并使用了Spring AI框架。隨著Spring AI不斷地完善&#xff0c;最近它發布了1.0正式版&#xff0c;意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…

【數據結構】基于順序表的通訊錄實現

目錄 1 順序表的概念及結構 1.1 線性表 1.2 順序表分類 1.2.1 靜態順序表 1.2.2 動態順序表 2 順序表的實現 2.1 順序表的初始化 2.2 順序表中數據的增加和修改 2.2.1 順序表的頭插 2.2.2 順序表的尾插 2.2.3 順序表的頭刪 2.2.4 順序表的尾刪 2.2.5 順序表指定位置…

C語言與匯編混合編程

一、GCC 擴展語法與MSVC約束 &#xff08;一&#xff09;GCC&#xff08;GNU Compiler Collection&#xff09;內聯匯編語法 asm("匯編指令");#或者 __asm__("匯編指令");#使用更復雜的語法來指定輸入、輸出操作數和修改的寄存器&#xff1a; asm volatile…