順序表(C語言詳細版)

1. 線性表

線性表(lina list)是n個具有相同特性的數據元素的有限序列。線性表是一種在實際中廣泛使用的數據結構,常見的線性表:順序表、鏈表、棧、隊列、字符串......

線性表在邏輯上是線性結構,也就是說連續的一條直線。但是在物理結構上并不一定是連續的,線性表在物理上存儲時,通常以數組和鏈式結構的形式存儲。

2. 順序表實現

2.1 概念及結構

順序表是用一段物理地址連續的存儲單元依次存儲數據元素的線性結構,一般情況下采用數組存儲。在數組上完成數據的增刪查改。

順序表一般可以分為:

1.靜態順序表:使用定長數組存儲。

2.動態順序表:使用動態開辟的數組存儲。

#define N 100
// 靜態順序表
struct SeqList
{int arr[N];int size;	// 有效數據個數
};

typedef int SLDataType;// 動態順序表
typedef struct SeqList
{SLDataType* arr;SLDataType size;	// 有效數據個數SLDataType capacity;	// 空間大小
}SL;

注意:靜態順序表只適用于確定知道需要多少數據的場景。靜態順序表的定長數組導致N定大了,空間開多了浪費,開少了不夠用。所以現實中基本都是使用動態順序表,根據需要動態地分配空間大小,所以下面我們實現動態順序表。

2.2 順序表初始化

// 順序表初始化
void SLInit(SL* ps);

首先,我們需要初始化數組,數組首元素地址 ps->arr 置為NULL;有效數字個數 size 和空間容量capacity 大小都置為0。

// 順序表初始化
void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}

2.3 順序表銷毀

// 順序表銷毀
void SLDestroy(SL* ps);

我們使用完順序表之后,都需要把順序表進行銷毀,以免造成內存被占用和內存泄漏問題。

首先,需要把開辟的空間 free 掉,再將數組首元素地址 ps->arr 置為NULL;有效數字個數 size 和空間容量 capacity 大小都置為0。

// 順序表銷毀
void SLDestroy(SL* ps)
{if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}

2.4 順序表打印

// 順序表打印
void SLPrint(SL s);

為了更好地對程序進行調試,我們這里需要寫一個打印程序,以便我們測試每一個接口函數。

// 順序表打印
void SLPrint(SL s)
{for (int i = 0; i < s.size; i++){printf("%d ", s.arr[i]);}printf("\n");
}

附:我們完成這些前導工作,接下來我們就可以正式編寫順序表的功能函數。

2.5 順序表尾插

// 順序表尾插
void SLPushBack(SL* ps, SLDataType x);

我們得分兩種情況:

不過在尾插元素之前,我們必須得確保數組空間大小是足夠的,也就是說得有空間插入元素。如果說空間容量不夠的話,我們就得擴容,所以說在尾插之前,我們得判斷空間大小是否足夠,不夠咱就擴容。我們這里得寫一個內存容量檢查函數。

這里我們還得注意一個點:就是我們內存空間不夠的情況下,一般我們是以2倍或者3倍? capacity(容量) * 2 * sizeof(數據類型) 去開辟空間。

// 檢查內存函數
void SLCheckCapacity(SL* ps)
{// 插入數據之前看空間夠不夠if (ps->capacity == ps->size){// 申請空間// 申請之前,要判斷一下capacity是否為0int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;錯誤寫法:這里不要直接這樣寫,要不然申請空間失敗的話,前面的數據會丟失//ps->arr = (SLDataType*)realloc(ps->arr, newCapacity * 2 * sizeof(SLDataType));// 正確寫法SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * 2 * sizeof(SLDataType));// 如果申請失敗if (tmp == NULL){perror("realloc fail!");exit(1);	// 直接退出程序,不再繼續執行}// 空間申請成功ps->arr = tmp;ps->capacity = newCapacity;}
}

檢查開辟完空間后,我們就可以進行下一步,順序表尾插接口函數編寫。

步驟:

① 程序開始前,我們要斷言一下,確保指針是有效的,不是NULL;

② 檢查內存是否足夠;

③ 將我們需要的 x 尾插入下標 ps->size 的位置,插完之后,數組元素總個數 ps->size 得加1。

// 順序表尾插
void SLPushBack(SL* ps, SLDataType x)
{溫柔的解決方式//if (ps == NULL)//	return;assert(ps); // 等價于assert(ps != NULL)// 檢查內存SLCheckCapacity(ps);/*ps->arr[ps->size] = x;++ps->size;*/ps->arr[ps->size++] = x;
}

2.6 順序表頭插

// 順序表頭插
void SLPushFront(SL* ps, SLDataType x);

我們也得分兩種情況:

不過我們在頭插元素之前,我們也得確保數組空間大小是足夠的,所以我們頭插之前也得調用一下內存檢查函數 SLCheckCapacity,保證我們內存容量是足夠的。

步驟:

① 程序開始前,我們要斷言一下,確保指針是有效的,不是NULL;

② 檢查內存是否足夠;

③ 將我們需要的 x 頭插入下標 0?的位置,插完之后,數組元素總個數 ps->size 得加1。

// 順序表頭插
void SLPushFront(SL* ps, SLDataType x)
{assert(ps);// 檢查內存SLCheckCapacity(ps);// 先讓順序表中已有的數據整體往后挪動一位for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1]; // arr[1] = arr[0]}ps->arr[0] = x;ps->size++;
}

2.6 順序表尾刪

// 順序表尾刪
void SLPopBack(SL* ps);

我們刪除數據不是說要把這個數據從數組中去除,而是說我們這個所謂的“刪除的數據”不能被訪問,所以我們只需把數組中有效的元素個數 size - 1 即可,并不需要把這個數據變成什么其他的數,這是非常多余的(如果非要更改刪除數據也不是不可)。

步驟:

① 程序開始前,我們要斷言一下,確保指針是有效的,不是NULL;

② 斷言一下,數據有效個數不能為0;

③ 將數據有效個數 size - 1。

// 順序表尾刪
void SLPopBack(SL* ps)
{assert(ps);assert(ps->size);	// 順序表有效數字不能為0// 順序表不能為空//ps->arr[ps->size - 1] = -1;	// 這行代碼有點多余ps->size--;
}

附:尾刪還是非常簡單的!

2.7 順序表

// 順序表頭刪
void SLPopFront(SL* ps);

頭刪數據之后,我們還需要每個數據往前一位,最后 size - 1。

步驟:

① 程序開始前,我們要斷言一下,確保指針是有效的,不是NULL;

② 斷言一下,數據有效個數不能為0;

③? 然后將每個數據往前移動一位;

③ 將數據有效個數 size - 1。

// 順序表頭刪
void SLPopFront(SL* ps)
{assert(ps);assert(ps->size);	// 順序表有效數字不能為0// 數據整體往前挪動一位for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1]; // 最后一次,arr[size - 2] = arr[size - 1]}ps->size--;
}

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

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

相關文章

一文匯總全球熱門新聞API

新聞API通過提供快速、準確和全面的新聞內容&#xff0c;已經成為現代社會不可或缺的一部分&#xff0c;對人們的生活、工作環境和科技發展產生了深遠的影響。新聞API使人們能夠快速獲取來自世界各地的實時新聞和信息&#xff0c;提高了信息的可訪問性。通過新聞API&#xff0c…

C++算法學習心得八.動態規劃算法(6)

1.最長遞增子序列&#xff08;300題&#xff09; 題目描述&#xff1a; 給你一個整數數組 nums &#xff0c;找到其中最長嚴格遞增子序列的長度。 子序列是由數組派生而來的序列&#xff0c;刪除&#xff08;或不刪除&#xff09;數組中的元素而不改變其余元素的順序。例如&…

Redis分布式集群部署

目錄 一. 原理簡述 二. 集群配置??????? 2.1 環境準備 2.2 編譯安裝一個redis 2.3 創建集群 2.4 寫入數據測試 實驗一&#xff1a; 實驗二&#xff1a; 實驗三&#xff1a; 實驗四&#xff1a; 添加節點 自動分配槽位 提升節點為master&#xff1a; 實驗…

關于電商平臺分類||電商平臺商品分類接口|電商平臺商品數據

電商平臺 做電商&#xff0c;則要有電商平臺&#xff0c;一個為 企業 或 個人 提供網上交易洽談的平臺。. 企業電子商務平臺是建立在 Internet 網上進行商務活動的虛擬網絡空間和保障商務順利運營的管理環境&#xff1b;是協調、整合 信息流 、貨物流、 資金流 有序、關聯、高效…

會員信息一鍵同步!微盟與客如云聯手打造智能服務新體驗!

客戶介紹 某房地產開發有限公司&#xff0c;自成立以來一直深耕于房地產行業&#xff0c;憑借卓越的開發實力和前瞻性的市場眼光&#xff0c;成為了業界備受矚目的企業。多年來&#xff0c;該公司始終堅持“品質至上&#xff0c;客戶為先”的經營理念&#xff0c;致力于為客戶…

新一代Java框架Quarkus的性能優化與應用

新一代Java框架Quarkus的性能優化與應用 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 引言 隨著云原生技術的發展&#xff0c;Java開發者們對于構建輕量級、…

JavaScript 編程語言【 數據類型】過濾|排序|映射|迭代

文章目錄 將 border-left-width 轉換成 borderLeftWidth過濾范圍原位&#xff08;in place&#xff09;過濾范圍降序排列復制和排序數組創建一個可擴展的 calculator映射到 names映射到對象按年齡對用戶排序隨機排列數組獲取平均年齡數組去重從數組創建鍵&#xff08;值&#x…

掌握React與TypeScript:從零開始繪制中國地圖

最近我需要使用reactts繪制一個界面&#xff0c;里面需要以中國地圖的形式展示區塊鏈從2019-2024年這五年的備案以及注銷情況&#xff0c;所以研究了一下這方面的工作&#xff0c;初步有了一些成果&#xff0c;所以現在做一些分享&#xff0c;希望對大家有幫助&#xff01; 在這…

手把手搞定報名亞馬遜科技認證

引言 亞馬遜云科技認證考試為我們這些技術從業者提供了提升專業技能的機會。無論選擇線上還是線下考試&#xff0c;每種方式都有其獨特的優勢和挑戰。選擇合適的考試方式將幫助我們更好地展示自己的技術水平。以下是我對不同考試方式的優缺點介紹&#xff0c;以及各科目的考試…

【pytorch12】什么是梯度

說明 導數偏微分梯度 梯度&#xff1a;是一個向量&#xff0c;向量的每一個軸是每一個方向上的偏微分 梯度是有方向也有大小&#xff0c;梯度的方向代表函數在當前點的一個增長的方向&#xff0c;然后這個向量的長度代表了這個點增長的速率 藍色代表比較小的值&#xff0c;紅色…

七月論文審稿GPT第5版:拿我司七月的早期paper-7方面review數據集微調LLama 3

前言 llama 3出來后&#xff0c;為了通過paper-review的數據集微調3&#xff0c;有以下各種方式 不用任何框架 工具 技術&#xff0c;直接微調原生的llama 3&#xff0c;畢竟也有8k長度了 效果不期望有多高&#xff0c;純作為baseline通過PI&#xff0c;把llama 3的8K長度擴展…

基于Linux的云端垃圾分類助手

項目簡介 本項目旨在開發一個基于嵌入式系統的智能垃圾分類裝置。該裝置能夠通過串口通信、語音播報、網絡通信等多種方式&#xff0c;實現垃圾的自動識別和分類投放。系統采用多線程設計&#xff0c;確保各功能模塊高效并行工作。 項目功能 垃圾分類識別 系統使用攝像頭拍攝…

解密tar文件解壓的Java實現技術

解密tar文件解壓的Java實現技術 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 引言 在日常的軟件開發和系統管理中&#xff0c;經常會遇到需要解壓縮文件的…

代碼隨想三刷動態規劃篇5

代碼隨想三刷動態規劃篇5 377. 組合總和 Ⅳ題目代碼 57. 爬樓梯&#xff08;第八期模擬筆試&#xff09;題目代碼 322. 零錢兌換題目代碼 279. 完全平方數題目代碼 377. 組合總和 Ⅳ 題目 鏈接 代碼 class Solution {public int combinationSum4(int[] nums, int target) {…

SM2的簽名值byte數組與ASN.1互轉

ASN.1抽象語言標記(Abstract Syntax Notation One) ASN.1是一種 ISO/ITU-T 標準,描述了一種對數據進行表示、編碼、傳輸和解碼的數據格式,它提供了一整套正規的格式用于描述對象的結構。 一、該結構的應用場景 例如在做待簽名的數字信封時,數字信封使用ASN.1封裝,這個時…

MySQL-行級鎖(行鎖、間隙鎖、臨鍵鎖)

文章目錄 1、介紹2、查看意向鎖及行鎖的加鎖情況3、行鎖的演示3.1、普通的select語句&#xff0c;執行時&#xff0c;不會加鎖3.2、select * from stu where id 1 lock in share mode;3.3、共享鎖與共享鎖之間兼容。3.4、共享鎖與排他鎖之間互斥。3.5、排它鎖與排他鎖之間互斥3…

論文調研_Awesome-Binary-Similarity

0. 概述 對 Awesome-Binary-Similarity 中列出的論文進行調研,重點總結這些論文的研究動機與未來研究方向。 1. 調研內容 論文名稱發表時間發表期刊期刊等級研究單位BinaryAI: Binary Software Composition Analysis via Intelligent Binary Source Code Matching2024年ICSE…

每日一題---OJ題:分隔鏈表

片頭 嗨&#xff01;小伙伴們&#xff0c;大家好&#xff01;今天我們一起來看看這道題----分隔鏈表 emmmm&#xff0c;這道題&#xff0c;看描述應該不算太難&#xff0c;我們一起來畫一畫圖唄&#xff01; 題目讀懂了&#xff0c;那么如何破解這道題呢&#xff1f; 思路&…

microApp vue3+vite+ts 子應用接入改造

公司做了一個平臺,使用的是microApp,需要把現有的一些系統作為子系統改造一下接入這個平臺,所以下面我說的都是子應用的改造,vue2的改造比較簡單,主要的vue3+vite+ts的改造。 參考官網 1、設置跨應用支持 vite默認開啟跨域支持,不需要額外配置。 2、注冊卸載函數 // …

nand flash spec

nand flash簡介 nand flash是一種非易失性存儲器。它具有高存儲密度、低成本和高耐用性的特點。 nand flash的特性是非易失性&#xff0c;即在電源關閉的情況下&#xff0c;數據仍然保留。 nand flash的存儲單元由浮動柵極晶體管組成&#xff0c;每個存儲單元可以存儲一位或多…