【探索數據結構】線性表之順序表

🎉🎉🎉歡迎蒞臨我的博客空間,我是池央,一個對C++和數據結構懷有無限熱忱的探索者。🙌

🌸🌸🌸這里是我分享C/C++編程、數據結構應用的樂園?

🎈🎈🎈期待與你一同在編程的海洋中遨游,探索未知的技術奧秘💞

📝專欄指路:

📘【C++】專欄:深入解析C++的奧秘,分享編程技巧與實踐。

📘【數據結構】專欄:探索數據結構的魅力,助你提升編程能力。

前言

初步認識了數據結構后,我們一起來探索它的邏輯結構里面的線性結構吧。線性結構是一對一的關系。線性表在邏輯結構上是連續的,在物理結構上不一定是連續的。線性表中的順序表(本篇的主角)在物理結構上是連續的,而線性表中的鏈表在物理結構上卻是不連續的。

一、線性表

線性表是具有相同數據類型的n(n≥0)個數據元素的有限序列,其中n為表長,當n=0時線性表是一個空表。

幾個概念:

1.ai是線性表中的“第i個”元素線性表中的位序(位序從1開始,注意區分數組下標從0開始

2.a1是表頭元素;an是表尾元素。

3.除第一個元素外,每個元素有且僅有一個直接前驅(前一個元素);除最后一個元素外,每個元素有且僅有一個直接后繼(后一個元素)

9d59d7f954594b72b79f785bc43c8078.png

二、順序表

正片開始!

1.概念

順序表——用順序存儲的方式實現線性表順序存儲。把邏輯上相鄰的元素存儲在物理位置上也相鄰的存儲單元中,元素之間的關系由存儲單元的鄰接關系來體現。順序表的底層是數組。

9d44e91b48c64bed94713f95e628031c.jpg

2.靜態順序表

順序表的空間大小固定

補充:為了簡化代碼,我們使用typedef 重命名自定義類型,typedef的優勢是什么?

在C或C++中,typedef 關鍵字用于為已存在的數據類型定義一個新名稱(別名)。這在需要簡化復雜的數據類型聲明,或者為特定的數據類型提供一個更有描述性的名稱時非常有用。

代碼如下:

typedef int SQLDataType;//順序表的數據類型
//靜態順序表
typedef struct SeqList
{SQLDataType arr[100];int size;//有效數據個數int capacity;//空間大小
}SL;

3.動態順序表

順序表的大小空間不固定,可根據需求改變。

當順序表存滿時,用realloc增容。

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

補充:realloc擴容的規則是什么?

一次擴充一個空間 ,插入一個元素還不會造成空間浪費程序(執行效率低下)

一次擴容固定個大小的空間(10、100…)【小了造成頻繁擴容】【大了造成空間浪費】

最優解:成倍數的增加(1.5倍、2倍),數據插入的越多擴容的大小越來越大

擴容后會自動把原有空間釋放掉

82685d545a784ea69d837396cae09657.png

malloc,realloc,calloc三者區別是什么?

  • malloc函數:用于動態分配指定字節數的內存空間,并返回一個指向它的指針。如果分配成功,則返回非空指針;如果內存空間不足,則返回NULL。需要注意的是,malloc分配的內存空間并未初始化,它們的值是未知的。
  • calloc函數:也用于動態分配內存空間,與malloc有所不同。calloc在分配內存空間時,會將其初始化為0。它的參數是要分配的元素個數和每個元素的大小,而不是總的字節數。如果分配成功,則返回指向分配的內存的指針;如果失敗,則返回NULL。
  • realloc函數:用于調整之前分配的內存空間大小。它接收一個指向已分配內存的指針和一個新的大小,然后嘗試調整內存塊的大小。如果成功,則返回指向新的內存塊的指針;如果失敗,則返回NULL,而原來的內存塊保持不變。

代碼示例

//是否需要申請空間
void SQLcapacity(SL* ps)
{if (ps->capacity == ps->size)//空間已滿,需要申請空間{//realloc增容,一般增加成原本空間大小的二或三倍int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SQLDataType* tmp = (SQLDataType*)realloc(ps->arr, newcapacity * sizeof(SQLDataType));if (tmp == NULL){perror("reacoll fail!");//空間申請失敗exit(1);//退出程序}ps->arr = tmp;ps->capacity = newcapacity;}
}

4.對順序表的操作

(1)初始化

void InitSql(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}

(2)尾插

d934bfbb346e4a638f70d2beca95b97c.png

void PushBackSql(SL* ps, SQLDataType x)
{assert(ps);//插入之前先看空間夠不夠SQLcapacity(ps);ps->arr[ps->size++] = x;//size是順序表尾部,后置++插入x后size加一
}

(3)頭插

124e19006b51471aaab9c905f9ade1b9.png

//頭部插入
void PushHeadSql(SL* ps, SQLDataType x)
{assert(ps);//插入之前先看空間夠不夠SQLcapacity(ps);//讓原本的數據往后移一位for (int i = ps->size;i > 0;i--){ps->arr[i] = ps->arr[i - 1];//arr[1]=arr[0]讓arr[1]的位置放入原本arr[0]的數據}ps->arr[0] = x;ps->size++;
}

(4)查找

//查找指定數據
int FindPosSql(SL* ps, SQLDataType x)
{assert(ps);for (int i = 0;i < ps->size;i++){if (ps->arr[i] == x)return i;}return -1;
}

找到了返回下標,找不到則返回不存在的下標

(5)尾刪

//尾部刪除
void DelBackSql(SL* ps)
{assert(ps);assert(ps->size);//順序表為空時不能執行刪除操作ps->size--;
}

(6)頭刪

b688a74378ed4dc88226fa9a969ee07a.png

//頭部刪除
void DelHeadSql(SL* ps)
{assert(ps);assert(ps->size);//順序表為空時不能執行刪除操作//順序表存放數據整體往前挪一位for (int i = 0;i < (ps->size) - 1;i++){//arr[0]的位置放原本arr[1]的數據,最后是ps->arr[size-2]=ps->arr[size-1]ps->arr[i] = ps->arr[i + 1];//arr[0]的位置放原本arr[1]的數據,最后是ps->arr[size-2]=ps->arr[size-1]}ps->size--;
}

(7)在指定位置之前插入數據

89b960a539204d2c8b747945b29a0b28.png

//指定位置前插入
void AddPosSql(SL* ps, int pos, SQLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);//先看看空間夠不夠SQLcapacity(ps);//pos位置上的數和他后面的數整體往后挪一位for (int i = ps->size;i > pos;i--){ps->arr[i] = ps->arr[i - 1];//結束arr[pos+1]=arr[pos];}ps->arr[pos] = x;ps->size++;
}

(8)在指定位置刪除數據

38e8eb6590294644a348f55083f5ab38.png

//刪除指定位置數據
void DelPosSql(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos <= ps->size);//整體往前挪一位for (int i = pos;i < ps->size - 1;i++){ps->arr[i] = ps->arr[i + 1];//arr[size-2]=arr[size-1]}ps->size--;
}

(9)銷毀

//銷毀順序表
void DestroySql(SL* ps)
{if (ps->arr)//不是空表才需要釋放{free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}

順序表小結

a13c2e0f17464d7abd5d2d6220e6a887.png

下一篇預告:線性表之單鏈表

持續更新中...

敬請期待

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

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

相關文章

Vue3按順序調用新增和查詢接口

Vue3按順序調用新增和查詢接口 一、前言1、代碼 一、前言 如果你想將兩個調用接口的操作封裝在不同的方法中&#xff0c;你可以考慮將這兩個方法分別定義為異步函數&#xff0c;并在需要時依次調用它們。以下是一個示例代碼&#xff1a; 1、代碼 <template><div>…

豐田精益生產的模板

豐田精益生產&#xff0c;也被稱為豐田生產方式&#xff08;Toyota Production System, TPS&#xff09;&#xff0c;是一套完整的生產和管理系統&#xff0c;其核心目標是最大化效率、消除浪費&#xff0c;并通過持續改進來提升產品質量。 學習優秀企業 學習福特 豐田精益生產…

C語言之函數指針(持續更新)

C語言精髓是指針&#xff0c;指針知識深似海&#xff0c;遇到一些學習一些~ 文章目錄 1. typedef 定義函數指針類型2. void* 空指針的解引用 1. typedef 定義函數指針類型 函數參數化是指通過函數指針將函數的某些行為參數化。這樣&#xff0c;我們可以在調用函數時動態地指定…

【每日刷題】Day48

【每日刷題】Day48 &#x1f955;個人主頁&#xff1a;開敲&#x1f349; &#x1f525;所屬專欄&#xff1a;每日刷題&#x1f34d; &#x1f33c;文章目錄&#x1f33c; 1. 872. 葉子相似的樹 - 力扣&#xff08;LeetCode&#xff09; 2. 114. 二叉樹展開為鏈表 - 力扣&…

react中怎么為props設置默認值

在React中&#xff0c;你可以使用ES6的類屬性&#xff08;class properties&#xff09;或者函數組件中的默認參數&#xff08;default parameters&#xff09;來定義props的默認值。 1.類組件中定義默認props 對于類組件&#xff0c;你可以在組件內部使用defaultProps屬性來…

如何撰寫EI會議的投稿信?

撰寫EI會議的投稿信&#xff08;Cover Letter&#xff09;是向會議組織者介紹你的論文和研究工作的一個重要環節。以下是撰寫投稿信的一些關鍵步驟和建議&#xff1a; 投稿信的結構 信頭 你的信息&#xff1a;包括姓名、職位、單位名稱、通訊地址、電子郵件和電話號碼。日期&am…

力扣652. 尋找重復的子樹

Problem: 652. 尋找重復的子樹 文章目錄 題目描述思路復雜度Code 題目描述 思路 1.利用二叉樹的后序遍歷將原始的二叉樹序列化&#xff08;之所以利用后序遍歷是因為其在歸的過程中是會攜帶左右子樹的節點信息,而這些節點信息正是該解法要利用的東西&#xff09;&#xff1b; 2…

js積累二(web頁面實現 時間走秒)

<tr><td class"ys04"><span class"ys02">當前時間&#xff1a;</span></td><td colspan"2"><span class"showTime"></span><script>var t null;t setTimeout(time, 1000); /…

【ai】chatgpt的plugin已經廢棄

發現找不到按鈕,原來是要申請: https://openai.com/index/chatgpt-plugins/ 發現申請已經跳轉了,好像是廢棄了? 不接受新插件了,但是openai的api 是可以繼續用的。 https://openai.com/waitlist/plugins/We are no longer accepting new Plugins, builders can now create…

Windows11的這個地方暴露著你的隱私,把它關掉避免尷尬

前言 現在的電腦真的是越來越智能化&#xff01;現在有很多小伙伴都是用著Windows11的吧&#xff01;用習慣了Windows11之后&#xff0c;突然發現它還是挺順手的。 但不知道你有沒有發現&#xff0c;Windows11上面有個地方暴露著你的隱私。這個隱私可能是某個小姐姐的圖片&am…

XSS---DOM破壞

文章目錄 前言一、pandas是什么&#xff1f;二、使用步驟 1.引入庫2.讀入數據總結 一.什么是DOM破壞 在HTML中&#xff0c;如果使用一些特定的屬性名&#xff08;如id或name&#xff09;給DOM元素命名&#xff0c;這些屬性會在全局作用域中創建同名的全局變量&#xff0c;指向對…

算法:最大連續子序列和

53. 最大子數組和 給你一個整數數組 nums &#xff0c;請你找出一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&#xff0c;返回其最大和。 子數組是數組中的一個連續部分。 class Solution:def maxSubArray(self, nums: List[int]) -> int:a…

Vue $nextTick作?是什么怎么使用

Vue中的$nextTick是一個非常重要的方法&#xff0c;主要用于在DOM更新后執行延遲回調。其工作原理基于Vue的異步更新隊列機制。 當你在Vue實例上修改數據后&#xff0c;Vue并不會立即更新DOM&#xff0c;而是將這些修改操作推入一個隊列中&#xff0c;并在下一個事件循環的“t…

Shell | shell腳本中使用cp指令(外兩則)

sample"ENCFF253NIN" #等號兩側避免使用空格 source_path"/home/xxzhang/workplace/project/CRISPRa/Pacbio/CCS_TE.2/" target_path"./" cp "$source_path"/00-common_all.vcf.gz "$target_path" cp "$source_path&qu…

如何在Python中實現迭代器和可迭代對象

在Python中&#xff0c;可迭代對象&#xff08;iterable&#xff09;是一個對象&#xff0c;它可以返回一個迭代器&#xff08;iterator&#xff09;用于遍歷其元素。迭代器是一個對象&#xff0c;它有一個 __next__() 方法&#xff08;在Python 2中&#xff0c;它是 next() 方…

LiveGBS流媒體平臺GB/T28181用戶手冊-用戶管理:添加用戶、編輯、關聯通道、搜索、重置密碼

LiveGBS流媒體平臺GB/T28181用戶手冊-用戶管理:添加用戶、編輯、關聯通道、搜索、重置密碼 1、用戶管理1.1、添加用戶1.2、編輯用戶1.3、關聯通道1.4、重置密碼1.5、搜索1.6、刪除 2、搭建GB28181視頻直播平臺 1、用戶管理 1.1、添加用戶 添加用戶&#xff0c;可以配置登陸用戶…

STM32-按鍵控制LED

接上篇LED點亮;http://t.csdnimg.cn/9r6z7 目錄 一.硬件設計 二.軟件設計 三.完整代碼 四.結束語 一.硬件設計 按鈕接電源插入PB0引腳,如上圖所示 二.軟件設計 void key_init() {GPIO_InitTypeDef GPIO_InitStruct;//使能時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO…

【LeetCode:496. 下一個更大元素 I + 單調棧】

&#x1f680; 算法題 &#x1f680; &#x1f332; 算法刷題專欄 | 面試必備算法 | 面試高頻算法 &#x1f340; &#x1f332; 越難的東西,越要努力堅持&#xff0c;因為它具有很高的價值&#xff0c;算法就是這樣? &#x1f332; 作者簡介&#xff1a;碩風和煒&#xff0c;…

問題解決記錄1:nvidia-container-cli: initialization error: load library failed

本地docker運行 $ docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi 遇到這種報錯 Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error dur…

案例分享|Alluxio在自動駕駛模型訓練中的應用與部署

分享嘉賓&#xff1a; 楊林三-輝羲智能 關于輝羲智能&#xff1a; 輝羲智能致力打造創新車載智能計算平臺&#xff0c;提供高階智能駕駛芯片、易用開放工具鏈及全棧自動駕駛解決方案&#xff0c;運用獨創性“數據閉環定義芯片”方法學&#xff0c;助力車企構建低成本、大規模和…