數據結構——順序表seqlist

前言:大家好😍,本文主要介紹了數據結構——順序表部分的內容

目錄

一、線性表的定義

二、線性表的基本操作

三.順序表

1.定義

2.?存儲結構

3.?特點

四 順序表操作

4.1初始化

4.2 插入

4.2.1頭插

4.2.2 尾插

4.2.3 按位置插

4.3 刪除

4.3.1 頭刪

4.3.2 尾刪

?4.3.3 按位置刪

4.3.4 按值刪

4.4 查找?

4.5 刪除值val出現的位置

4.6 其余操作

4.7 主函數測試


一、線性表的定義

線性表是具有相同數據類型n個數據元素有限序列,n為表長,當n=0時線性表時一個空表。用l命名線性表,表示為l=(a1,a2,? ,an)。

線性表除第一個元素之外,每個元素都有直接前驅,除最后一個元素之外每個元素都有直接后繼

二、線性表的基本操作

Initlist(&L):初始化表,構造一個空的線性表L,構造一個空的線性表,分配內存空間

Destroylist(&L):銷毀。銷毀線性表并釋放線性表L所占用的內存空間

Insertlist(&L,i,e):插入,在表L中第i個位置上插入指定元素e

Deletelist(&L,i,&e):刪除,刪除表L中第i個位置上的元素,并用e返回刪除元素的值

LocateElem(L,e):按值查找,在表L中查找具有給定關鍵字e值的元素

? ?GetElem(L,i):按位查找,獲取表L中第i個位置的元素的值

Length(L):求表長,返回線性表L的長度,即L中數據元素的個數

Printlist(L):輸出,輸出線性表所有元素值

Empty(L):判空,若L為空,返回true,否則返回false

對參數的修改結果需要引用&

三.順序表

1.定義

順序表是一種線性表的存儲實現方式。線性表是具有相同數據類型的元素構成的有限序列,順序表通過數組的形式將這些元素存儲在內存中,并通過下標索引來訪問和操作元素。

2.?存儲結構

順序表通常使用數組來實現,數組的每個位置存儲一個元素。例如,一個順序表可以表示為:

數組:[a0, a1, a2, ..., an-1]
其中,a0 是表頭元素,an-1 是表尾元素。

3.?特點


優點:
隨機訪問:可以通過下標索引快速訪問任意位置的元素,時間復雜度為 O(1)。
存儲密度高:由于沒有額外的指針存儲空間,順序表的存儲利用率較高。
操作簡單:基于數組的實現使得順序表的操作邏輯相對簡單。
缺點:
插入和刪除效率低:插入或刪除元素時,需要移動大量元素以保持順序表的連續性,時間復雜度為 O(n)。
存儲空間固定:順序表的存儲空間在初始化時需要預先分配,難以動態擴展。如果分配的空間不足,需要重新分配更大的空間并復制數據;如果分配過多,則會浪費空間。
內存碎片問題:頻繁的動態擴展和收縮可能導致內存碎片化。

四 順序表操作

點h文件中定義了一個順序表(SeqList)的結構體

#define INIT_SIZE 10 //初始化時malloc購買的格子數量
//可庫容的順序表的結構體設計
typedef int ELEM_TYPE;
typedef struct SeqList
{ELEM_TYPE* elem;//用來接收malloc返回的數組首地址int length;//存放有效值個數int listsize;//存放數組的總的格子數
}SeqList, * PSeqList;
  • 作用:定義了一個宏 INIT_SIZE,表示順序表初始化時分配的內存大小(即初始容量)。

  • INIT_SIZE 被設置為 10,表示初始化時會分配 10 個元素的空間。

  • 結構體名稱SeqList,表示順序表的結構體。

  • 指針類型別名PSeqList,表示指向 SeqList 的指針。

  • ELEM_TYPE* 表示 elem 是一個指針,指向 ELEM_TYPE 類型的數據。ELEM_TYPE 是一個類型別名

4.1初始化

void Init_SeqList(struct SeqList* psl)
{//0.安全處理   每一個函數都要寫的assert(nullptr != psl);if (nullptr == psl){exit(EXIT_FAILURE);}//1.對我們的 elem 用來去malloc 在堆區購買一塊連續的空間psl->elem = (ELEM_TYPE*)malloc(INIT_SIZE * sizeof(ELEM_TYPE));if (NULL == psl->elem){exit(EXIT_FAILURE);}//2.對我們的 length 初始化為0psl->length = 0;//3.對我們的 listsize 初始化為 INITSIZEpsl->listsize = INIT_SIZE;}
  • 類型轉換malloc 返回的是 void* 類型的指針,需要強制轉換為 ELEM_TYPE*

  • 安全檢查:如果 malloc 分配失敗(返回 NULL),程序會退出。

  • length:表示順序表中當前存儲的元素個數,初始值為 0。

  • listsize:表示順序表當前分配的總容量,初始值為 INIT_SIZE

  • psl->elem 存儲了這塊內存的首地址。

  • 通過 psl->elem[i] 可以訪問順序表中的第 i 個元素。

  • 存儲元素elem 指向的內存空間被用來存儲順序表中的所有元素。例如,如果 elem 指向的內存空間大小為 INIT_SIZE,則可以存儲 INIT_SIZEELEM_TYPE 類型的元素。

4.2 插入

4.2.1頭插

bool Insert_Seqlist_head(PSeqList psl, ELEM_TYPE val)
{//0.assert//0.5 判滿if (Is_Full(psl)){Increase(psl);}//此時,肯定有空閑格子//1.集體向后挪(尾巴先動)for (int i = psl->length - 1; i >= 0; i--){psl->elem[i + 1] = psl->elem[i];}//2.將val放入0號下標psl->elem[0] = val;//3.有效值個數+1psl->length++;return true;
}
  • 邏輯:從順序表的尾部開始,逐個將元素向后移動一個位置。

    psl->elem[i + 1] = psl->elem[i]:將第 i 個元素移動到第 i + 1 個位置。
  • 循環條件:從 psl->length - 1 開始,直到 i = 0,確保所有元素都向后移動。

  • 更新順序表的長度,反映新插入的元素。

  • 函數返回 true,表示插入操作成功

psl->length 表示順序表中當前存儲的有效元素的個數。例如:如果 psl->length 的值為 5,說明順序表中有 5 個有效元素。

psl->length - 1 是對 psl->length 的值減去 1,如果 psl->length 為 5,那么最后一個有效元素的索引為 5 - 1 = 4。常用于從順序表的最后一個有效元素開始,逐個向前遍歷所有元素

4.2.2 尾插

bool Insert_Seqlist_tail(PSeqList psl, ELEM_TYPE val)
{//0.assert//0.5 判滿if (Is_Full(psl)){Increase(psl);}//此時,肯定有空閑格子psl->elem[psl->length] = val;psl->length++;return true;
}

4.2.3 按位置插

bool Insert_Seqlist_pos(PSeqList psl, ELEM_TYPE val, int pos)
{//默認pos==0 則認為是頭插//0.安全性處理   psl    pos合法性判斷assert(nullptr != psl);assert(pos >= 0 && pos <= psl->length);//0.5 判滿if (Is_Full(psl)){Increase(psl);}//此時,肯定有空閑格子//1.將插入位置之后的元素,統一向后挪動,把插入位置給空出來for (int i = psl->length - 1; i >= pos; i--){psl->elem[i + 1] = psl->elem[i];}//2.插入psl->elem[pos] = val;//3.length++psl->length++;return true;
}

通過 psl->elem[i] 可以訪問順序表中的第 i 個元素。

4.3 刪除

4.3.1 頭刪

bool Del_Seqlist_head(SeqList* psl)
{//0.assert//0.5 判空if (Is_Empty(psl))return false;//1.除了第一個元素之外,統一向前挪動for (int i = 1; i <= psl->length - 1; i++){psl->elem[i - 1] = psl->elem[i];}//2.有效值個數-1psl->length--;return true;
}

//1.除了第一個元素之外,統一向前挪動
?? ?for (int i = 1; i <= psl->length - 1; i++)
?? ?{
?? ??? ?psl->elem[i - 1] = psl->elem[i];
?? ?}

?//1.集體向后挪(尾巴先動)
?? ?for (int i = psl->length - 1; i >= 0; i--)
?? ?{
?? ??? ?psl->elem[i + 1] = psl->elem[i];
?? ?}

4.3.2 尾刪

//尾刪
bool Del_Seqlist_tail(SeqList* psl)
{//0.assert//0.5 判空if (Is_Empty(psl))return false;psl->length--;return true;
}

?4.3.3 按位置刪

bool Del_Seqlist_pos(SeqList* psl, int pos)
{//0.assert psl posassert(psl != NULL);assert(pos >= 0 && pos < psl->length);//0.5 判空isemptyif (Is_Empty(psl))return false;//1.將pos位置之后的有效值,統一向前覆蓋(頭先動)for (int i = pos + 1; i <= psl->length - 1; i++){psl->elem[i - 1] = psl->elem[i];}//2.有效值個數-1psl->length--;return true;
}

4.3.4 按值刪


//按值刪(只刪除這個val值出現的第一次的位置)
bool Del_Seqlist_val(SeqList* psl, ELEM_TYPE val)
{//0.assert//0.5 isempty//1.通過調用查找函數,查找val值在順序表中的位置int index = Search_SeqList(psl, val);//2.若返回的位置下標為-1 返回假  若不等于-1,則此時怎么刪if (index == -1)return false;return Del_Seqlist_pos(psl, index);
}

4.4 查找?


//4.查找數據是否已經存在(若存在,則只需要返回下標即可  找不到返回-1)
int Search_SeqList(PSeqList psl, ELEM_TYPE val)
{//0.assertfor (int i = 0; i < psl->length; i++){if (psl->elem[i] == val)return i;}return -1;
}

4.5 刪除值val出現的位置

//刪除當前val值出現的所有位置(1)
bool Del_SeqList_All_Val1(struct SeqList* psl, ELEM_TYPE val)
{int count = 0;for (int i = 0; i < psl->length; i++){if (psl->elem[i] == val){count++;}}for (int i = 0; i < count; i++){int index = Search_SeqList(psl, val);Del_Seqlist_pos(psl, index);}return true;}

?

//刪除當前val值出現的所有位置(2)
bool Del_SeqList_All_Val2(struct SeqList* psl, ELEM_TYPE val)
{int qianfangkongxiangezishu = 0;for (int i = 0; i < psl->length; i++){if (psl->elem[i] == val)qianfangkongxiangezishu++;elsepsl->elem[i - qianfangkongxiangezishu] = psl->elem[i];}psl->length = psl->length - qianfangkongxiangezishu;return true;
}

4.6 其余操作

//5.判空
bool Is_Empty(PSeqList psl)
{return psl->length == 0;
}//6.判滿
bool Is_Full(PSeqList psl)
{return psl->length == psl->listsize;
}//7.擴容函數(1.5 2)   默認用2倍擴容
void Increase(PSeqList psl)
{ELEM_TYPE* tmp = (ELEM_TYPE*)realloc(psl->elem, psl->listsize * sizeof(ELEM_TYPE) * 2);if (tmp != nullptr){psl->elem = tmp;}}//8.清空  (不釋放已購買的內存)
void Clear(PSeqList psl)
{//malloc申請空間先不釋放,而是認為所有格子里都是無效值psl->length = 0;
}//9.銷毀  (需要釋放malloc購買的內存的)
void Destroy(PSeqList psl)
{free(psl->elem);psl->length = psl->listsize = 0;
}//打印
void Show(PSeqList psl)
{//assertfor (int i = 0; i < psl->length; i++){printf("%d ", psl->elem[i]);}printf("\n");}

4.7 主函數測試

int main()
{struct SeqList sq;Init_SeqList(&sq);Insert_Seqlist_head(&sq, 100);Insert_Seqlist_head(&sq, 101);Insert_Seqlist_head(&sq, 102);Insert_Seqlist_tail(&sq, 200);Insert_Seqlist_tail(&sq, 201);Insert_Seqlist_tail(&sq, 202);Insert_Seqlist_tail(&sq, 2000);Insert_Seqlist_tail(&sq, 2010);Insert_Seqlist_tail(&sq, 2020);Insert_Seqlist_pos(&sq, 10000, 3);Show(&sq);Insert_Seqlist_head(&sq, 111);Insert_Seqlist_tail(&sq, 222);Show(&sq);//刪除Del_Seqlist_head(&sq);Del_Seqlist_tail(&sq);Show(&sq);Del_Seqlist_pos(&sq, 4);Show(&sq);Del_Seqlist_pos(&sq, 8);Show(&sq);Del_Seqlist_pos(&sq, 0);Show(&sq);Del_Seqlist_val(&sq, 201);Show(&sq);//Clear(&sq);//Show(&sq);//Destroy(&sq);//Show(&sq);//------------------------------------------------Insert_Seqlist_pos(&sq, 3, 2);Insert_Seqlist_pos(&sq, 3, 4);Insert_Seqlist_pos(&sq, 3, 6);Show(&sq);Del_SeqList_All_Val2(&sq, 3);Show(&sq);return 0;
}

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

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

相關文章

OSPF | LSDB 鏈路狀態數據庫 / SPF 算法 / 實驗

注&#xff1a;本文為 “OSPF | LSDB / SPF ” 相關文章合輯。 LSDB 和 SPF 算法 瀟湘浪子的蹋馬骨湯 發布 2019-02-15 23:58:46 1. 鏈路狀態數據庫 (LSDB) 鏈路狀態協議除了執行洪泛擴散鏈路狀態通告&#xff08;LSA&#xff09;以及發現鄰居等任務外&#xff0c;其第三個任…

前端---CSS(前端三劍客)

1.基本語法規范 選擇器 {?條/N條聲明} ? 選擇器決定針對誰修改 (找誰) ? 聲明決定修改啥. (?啥) ? 聲明的屬性是鍵值對. 使? ; 區分鍵值對, 使? : 區分鍵和值 比如&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta…

【C++】 —— 筆試刷題day_6

刷題day_6&#xff0c;繼續加油哇&#xff01; 今天這三道題全是高精度算法 一、大數加法 題目鏈接&#xff1a;大數加法 題目解析與解題思路 OK&#xff0c;這道題題目描述很簡單&#xff0c;就是給我們兩個字符串形式的數字&#xff0c;讓我們計算這兩個數字的和 看題目我…

todolist docker 小工具

參考鏈接 前排提示 沒有中文&#xff0c;可使用瀏覽器 翻譯 前提 安裝docker安裝docker-compose 下載倉庫 git clone https://github.com/JordanKnott/taskcafe進行安裝 cd taskcafe docker-compose -p taskcafe up -d服務啟動后會監聽在 3333 端口上&#xff0c;通過瀏覽器…

Unity--GPT-SoVITS接入、處理GPTAPI的SSE響應流

GPT-SoVITS GPT-SoVITS- v2&#xff08;v3也可以&#xff0c;兩者對模型文件具有兼容&#xff09; 點擊后 會進入新的游覽器網頁 ----- 看了一圈&#xff0c;發現主要問題集中在模型的訓練很需要CPU&#xff0c;也就是模型的制作上&#xff0c;問題很多&#xff0c;如果有現有…

《TypeScript 快速上手:類型、編譯與嚴格模式的簡明教程》

一、TypeScript介紹 在引入編程社區 20 多年后&#xff0c;JavaScript 現在已成為有史以來應用最廣泛的跨平臺語言之一。JavaScript 最初是一種用于向網頁添加微不足道的交互性的小型腳本語言&#xff0c;現已發展成為各種規模的前端和后端應 用程序的首選語言。雖然用 JavaSc…

ROS2 系統架構

1.操作系統層 ros2是基于Linux、Windows、macOS系統建立的&#xff0c;這一層為ros2提供了各種基礎的硬件驅動&#xff0c;比如網卡驅動&#xff0c;常用USB驅動和常用攝像頭驅動等。 2.DDS實現層 ros2的核心通信是采用第三方的通信組件來實現的&#xff0c;這個第三方就是數…

【HTML】二、列表、表格

文章目錄 1、列表1.1 無序列表1.2 有序列表1.3 定義列表 2、表格2.1 定義2.2 表格結構標簽2.3 合并單元格 1、列表 列表分為&#xff1a; 無序列表有序列表定義列表&#xff1a;一個標題下有多個小分類 1.1 無序列表 ul嵌套li&#xff0c;ul是無序列表&#xff0c;li是列表…

redis zset基本介紹以及底層實現

ZSet&#xff08;Sorted Set&#xff09;有序集合 介紹 Redis 中的有序集合(Sorted Set)是在集合(Set)的基礎上,為每個成員關聯了一個分數(score)。這個分數可以用來對集合中的成員進行排序。 有序集合保留了集合不能有重復成員的特性&#xff08;成員不能重復&#xff0c;分值…

政策助力,3C 數碼行業數字化起航

政策引領&#xff0c;數字經濟浪潮來襲 在當今時代&#xff0c;數字經濟已成為全球經濟發展的核心驅動力&#xff0c;引領著新一輪科技革命和產業變革的潮流。我國深刻洞察這一發展趨勢&#xff0c;大力推進數字化經濟發展戰略&#xff0c;為經濟的高質量發展注入了強大動力。 …

IntelliJ IDEA 快捷鍵系列:重命名快捷鍵詳解

目錄 引言一、默認重命名快捷鍵1. Windows 系統?2. Mac 系統? 二、操作步驟與技巧1. 精準選擇重命名范圍?2. 智能過濾無關內容? 三、總結 引言 在代碼重構中&#xff0c;?重命名變量、類、方法? 是最常用的操作之一。正確使用快捷鍵可以極大提升開發效率。本文針對 ?Ma…

文檔搜索引擎

首先獲取很多網頁(爬蟲->一個http客戶端,發送http請求獲取http響應結果(就是網站))(批量化的獲取很多的頁面) 再根據用戶輸入的查詢詞,在網頁中進行查找 用戶輸入查詢詞之后,如何讓查詢詞和當前這些網頁進行匹配 ->使用倒排索引 倒排索引 1.文檔: 每個待搜索的網頁(被爬…

開源工具利器:Mermaid助力知識圖譜可視化與分享

在現代 web 開發中&#xff0c;可視化工具對于展示流程、結構和數據關系至關重要。Mermaid 是一款強大的 JavaScript 工具&#xff0c;它使用基于 Markdown 的語法來呈現可定制的圖表、圖表和可視化。對于展示流程、結構和數據關系至關重要。通過簡單的文本描述&#xff0c;你可…

C# --- LINQ

C# --- LINQ 什么是LINQFluent Syntax 和 SQL-Like QueryLINQ Operations 什么是LINQ LINQ的全稱為Language Integrated Query, 為各種查詢(包括對象查詢&#xff0c;數據庫查詢&#xff0c;XML查詢) 提供了統一模型.LINQ源于SQL&#xff0c;但比SQL更加強大&#xff0c;更加靈…

【AI News | 20250316】每日AI進展

AI Repos 1、ReActMCP 將網絡搜索能力集成到AI助手中的一個MCP服務&#xff1a;ReActMCP Web Search&#xff0c;相當于給AI裝了個搜索引擎&#xff0c;可以實時查找最新的內容。它基于Exa API執行基本和高級網絡搜索&#xff0c;高級搜索比如限制搜索的網站范圍、指定日期范圍…

【VUE】day04-組件的生命周期、組件之間的數據共享、ref引用、購物車案例

【VUE】day04-組件的生命周期、組件之間的數據共享、ref引用、購物車案例 1. 組件之間的關系2. 使用組件的三個步驟3. vue.components全局注冊組件4. 自動生成右邊標簽插件5. 組件的props6. 結合v-bind使用自定義屬性7. props的默認default值8. type值類型9. 組件之間的樣式沖突…

Redis分布式鎖深度剖析:從原理到Redisson實戰,破解腦裂與高并發鎖難題

一、&#x1f4cc; 分布式鎖的核心應用場景 場景類型典型案例風險說明&#x1f680; 高并發場景電商秒殺、票務搶購庫存超賣風險? 定時任務場景集群日志清理、數據統計任務重復執行&#x1f504; 冪等場景支付接口重試、訂單創建資金重復扣款 二、&#x1f527; Redis分布式鎖…

量化交易學習筆記02:雙均線策略

雙均線策略示例 個股&#xff1a;中國平安 回測日期&#xff1a;2022-5-1至2023-5-1 短均線&#xff1a;5天 長無線&#xff1a;10天 代碼&#xff1a; def initialize(context):# 初始化此策略# 設置我們要操作的股票池, 這里我們只操作一支股票# """標的&qu…

交換機控制軟件的實現步驟猜測

一、主要目的 提出對交換機軟件控制邏輯的猜測。 二、交換機控制軟件的組成 (一)背景 1、交換機有很多的RJ45水晶頭端口。 2、每個端口支持同時發送和接收字節數據。 3、每個端口接收的數據需要查表后才能轉發給目標端口。 (二)端口狀態掃描線程 負責掃描每個端口的狀態&#x…

Part1:基于國內源完成Kubernetes集群部署

集群規劃 操作系統&#xff1a;CentOS7 內核版本&#xff1a;5.4&#xff08;需升級&#xff09; 組件版本說明操作系統內核5.4RPM方式升級docker26.1.4yum安裝cri-docker0.3.16二進制安裝kubeadm1.30.11yum安裝kubealet1.30.11yum安裝kubectl1.30.11yum安裝kubectl1.30.11yu…