數據結構(一):順序表詳解

在正式介紹順序表之前,我們有必要先了解一個名詞:線性表。

線性表:

線性表是,具有n個相同特性的數據元素的有限序列。常見的線性表:順序表、鏈表、棧、隊列、數組、字符串...

線性表在邏輯上是線性結構,但在物理結構上并不一定是連續的。


1. 順序表概念

順序表是用一段物理地址連續的儲存單元、依次存儲數據元素的線性結構,一般情況下采用數組存儲。

?

2. 順序表定義

typedef int SLDataType;// 順序表數據類型typedef struct SeqList
{SLDataType* arr; // 指向動態開辟的數組int size;        // 有效數據個數int capacity;    // 容量
}SL;

3. 順序表的初始化

順序表的初始化,是使用 動態內存管理 開辟空間構造一個空的順序表

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>#define DefaultCapacity 4 // 默認初始化空間大小void SLInit(SL* ps)
{assert(ps);SLDataType* tmp = (SLDataType*)malloc(sizeof(SLDataType) * DefaultCapacity);if (tmp == NULL){perror("malloc");exit(-1);}ps->arr = tmp;ps->capacity = DefaultCapacity;ps->size = 0;
}

4. 在pos位置插入元素

在pos位置插入數據之前,要檢查動態順序表的容量是否足夠 ,

不夠則利用 realloc函數 開辟一塊更大的空間給順序表。

檢查容量/擴容:
void SLCapacityCheck(SL* ps)
{assert(ps);if (ps->size == ps->capacity){SLDataType* tmp = (SLDataType*)realloc(ps->arr, ps->capacity * 2 * sizeof(SLDataType));if (tmp == NULL){perror("realloc");exit(-1);}ps->capacity *= 2;ps->arr = tmp;}
}
插入:
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);SLCapacityCheck(ps);for (int i = ps->size - 1; i >= pos; i--){ps->arr[i + 1] = ps->arr[i];}ps->arr[pos] = x;ps->size++;
}

5. 刪除pos位置元素

void SLErase(SL* ps, int pos)
{assert(ps);for (int i = pos + 1; i < ps->size; i++){ps->arr[i - 1] = ps->arr[i];}ps->size--;
}

6. 順序表查找(按值查找)

int SLFind(SL* ps, SLDataType x)
{assert(ps);for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x)return i;}// 找不到所查找的元素return -1;
}

在主函數中使用 SLFind函數 時,應檢驗 “返回值” 是否為非 -1,再使用

7. 順序表的打印

void SLPrint(SL* ps)
{assert(ps);for (int i = 0; i < ps->size; i++){printf("%d ", ps->arr[i]);}printf("\n");
}

8. 順序表銷毀

void SLDestroy(SL* ps)
{assert(ps);free(ps->arr);ps->capacity = 0;ps->size = 0;
}

銷毀 arr 所指向的空間,將空間還給操作系統。

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

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

相關文章

【云原生】Pod詳講

目錄 一、Pod基礎概念1.1//在Kubrenetes集群中Pod有如下兩種使用方式&#xff1a;1.2pause容器使得Pod中的所有容器可以共享兩種資源&#xff1a;網絡和存儲。1.3kubernetes中的pause容器主要為每個容器提供以下功能&#xff1a;1.4Kubernetes設計這樣的Pod概念和特殊組成結構有…

Django中級指南:理解并實現Django的模型和數據庫遷移

Django 是一個極其強大的 Python Web 框架&#xff0c;它提供了許多工具和特性&#xff0c;能夠幫助我們更快速、更便捷地構建 Web 應用。在本文中&#xff0c;我們將會關注 Django 中的模型&#xff08;Models&#xff09;和數據庫遷移&#xff08;Database Migrations&#x…

上傳代碼到GitCode

Git 全局設置 git config --global user.name "AnyaPapa" git config --global user.email "fangtaihongqq.com" 添加SSH密鑰 Mac終端輸入命令 cd existing_folder git init git remote add origin gitgitcode.net:Java_1710/test.git git add . git co…

2023國賽數學建模A題思路分析

文章目錄 0 賽題思路1 競賽信息2 競賽時間3 建模常見問題類型3.1 分類問題3.2 優化問題3.3 預測問題3.4 評價問題 4 建模資料 0 賽題思路 &#xff08;賽題出來以后第一時間在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 競賽信息 全國大學生數學建模…

Mac電腦如何把照片以文件格式導出?

在Mac電腦上&#xff0c;我們經常會拍攝、保存和編輯各種照片。有時候&#xff0c;我們可能需要將這些照片以文件形式導出&#xff0c;以便與他人共享、打印或備份。無論您是要將照片發送給朋友、上傳到社交媒體&#xff0c;還是保存到外部存儲設備&#xff0c;導出照片為文件是…

我的Python教程:使用Pyecharts畫柱狀圖

Pyecharts是一個用于生成 Echarts 圖表的 Python 庫。Echarts 是一個基于 JavaScript 的數據可視化庫&#xff0c;提供了豐富的圖表類型和交互功能。通過 Pyecharts&#xff0c;你可以使用 Python 代碼生成各種類型的 Echarts 圖表&#xff0c;例如折線圖、柱狀圖、餅圖、散點圖…

java不支持解壓rar5的解決辦法--引用本地7zip.exe

由于rar5算法未開源&#xff0c;沒有合適的JAVA依賴能夠解決解壓rar5。在運行中報錯&#xff1a; javacom.github.junrar.exception.RarException: badRarArchive 通過引用本地7zip.exe&#xff0c;命令行執行解決&#xff1a; private static void unZipRar5File(String fileP…

探索可視化應用的嶄新前景

在當今數據驅動的世界中&#xff0c;可視化應用成為了一種強大的工具&#xff0c;能夠將復雜的數據轉化為易于理解和分析的圖形形式。隨著技術的不斷發展和創新&#xff0c;可視化應用正迎來嶄新的前景。本文將介紹可視化應用的定義、重要性以及當前的發展趨勢&#xff0c;并探…

Controller是單例還是多例?

Controller是單例還是多例&#xff1f; controller默認是單例的&#xff0c;不要使用非靜態的成員變量&#xff0c;否則會發生數據邏輯混亂。正因為單例所以不是線程安全的。 我們下面來簡單的驗證下&#xff1a; package com.riemann.springbootdemo.controller;import org…

docker配置文件

/etc/docker/daemon.json 文件作用 /etc/docker/daemon.json 文件是 Docker 配置文件&#xff0c;用于配置 Docker 守護進程的行為和參數。Docker 守護進程是負責管理和運行 Docker 容器的后臺進程&#xff0c;通過修改 daemon.json 文件&#xff0c;可以對 Docker 守護進程進…

不做Linux就沒前途嗎?

答案當然是——并不會 我晚上回來的時候跟一個今年的畢業生聊天&#xff0c;他入職了一家公司&#xff0c;但是從事的不是Linux相關的工作。 我這里想說的是&#xff0c;做Linux可以賺錢&#xff0c;Linux現在是全世界最牛逼的開源項目一點都不為過&#xff0c;但是Linux也不是…

NLP(六十五)LangChain中的重連(retry)機制

關于LangChain入門&#xff0c;讀者可參考文章NLP&#xff08;五十六&#xff09;LangChain入門 。 ??本文將會介紹LangChain中的重連機制&#xff0c;并嘗試給出定制化重連方案。 ??本文以LangChain中的對話功能&#xff08;ChatOpenAI&#xff09;為例。 LangChain中的重…

【Mysql】數據庫基礎與基本操作

&#x1f307;個人主頁&#xff1a;平凡的小蘇 &#x1f4da;學習格言&#xff1a;命運給你一個低的起點&#xff0c;是想看你精彩的翻盤&#xff0c;而不是讓你自甘墮落&#xff0c;腳下的路雖然難走&#xff0c;但我還能走&#xff0c;比起向陽而生&#xff0c;我更想嘗試逆風…

Centos 7 出現 write error (disk full?)

問題 mysql 導入任務時&#xff0c;由于導出的 sql 文件是在很大 &#xff08;30G&#xff09;&#xff0c;利用 SQLDumpSpliter 切割工具 切成幾個 1G 大小的 sql 文件 結果在導入大半天&#xff0c;突然報錯 &#xff08;另一個服務器上更慘&#xff0c;都導入兩天快完成的…

一分鐘上手Vue VueI18n Internationalization(i18n)多國語言系統開發、國際化、中英文語言切換!

這里以Vue2為例子 第一步&#xff1a;安裝vue-i18n npm install vue-i18n8.26.5 第二步&#xff1a;在src下創建js文件夾&#xff0c;繼續創建language文件夾 在language文件夾里面創建zh.js、en.js、index.js這仨文件 這仨文件代碼分別如下&#xff1a; zh.js export de…

在Eclipse在Java里面調用Python腳本的方法

由于項目中需要用到Java調用Python的腳本&#xff0c;來實現一些功能&#xff0c;就對jython做了一些了解&#xff0c;通過jython可以實現java對python腳本的調用。Java調用Python開發環境配置(EclipseJythonPyDev) 1、Jython是什么 Java可以使用Jython庫來調用Python庫。Jyt…

你不得不懂的IT知識-《敏捷項目管理》

國林哥在IBM時&#xff0c;幾乎每天都會收到關于“敏捷”相關的郵件&#xff0c;公司鼓勵我們去學習郵件里的知識&#xff0c;參加敏捷相關的認證和培訓。剛開始我和大多數同事一樣不管不顧&#xff0c;后來隨著PBC里要求加上成長目標&#xff0c;比如要獲得一個認證&#xff0…

React使用antd的圖片預覽組件,點擊哪個圖片就預覽哪個的設置

使用了官方推薦的相冊模式的預覽&#xff0c;但是點擊預覽之后&#xff0c;每次都是從圖片列表的第一張開始預覽&#xff0c;而不是點擊哪張就從哪張開始預覽&#xff1a; 所以這里我就封裝了一下&#xff0c;對初始化預覽的列表進行了邏輯處理&#xff1a; 當點擊開始預覽的…

加載并繪制時間域內的心電圖信號,并實施Q因子為1的陷波濾波器以去除50 Hz頻率研究(Matlab代碼實現)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;歡迎來到本博客????&#x1f4a5;&#x1f4a5; &#x1f3c6;博主優勢&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客內容盡量做到思維縝密&#xff0c;邏輯清晰&#xff0c;為了方便讀者。 ??座右銘&a…