【數據結構】02.順序表

一、順序表的概念與結構

1.1線性表

線性表(linear list)是n個具有相同特性的數據元素的有限序列。線性表是?種在實際中廣泛使用的數據結構,常見的線性表:順序表、鏈表、棧、隊列、字符串…
線性表在邏輯上是線性結構,也就說是連續的?條直線。但是在物理結構上并不?定是連續的,線性表在物理上存儲時,通常以數組和鏈式結構的形式存儲。

1.2順序表分類

1.2.1 順序表和數組的區別

順序表的底層結構是數組,對數組的封裝,實現了常用的增刪改查等接口

1.2.2順序表分類

  • 靜態順序表

概念:使用定長數組存儲元素
在這里插入圖片描述
靜態順序表缺陷:空間給少了不夠用,給多了造成空間浪費

  • 動態順序表

在這里插入圖片描述

二、動態順序表的實現

2.1結構體表示順序表

首先需要一個結構體來表示順序表:

typedef int SLDataType;//筆者在此直接使用了接下來要實現的順序表的數據類型
//順序表結構體
typedef struct SL
{SLDataType* a;int size;int capacity;
}SL;

2.2順序表的初始化和銷毀

//初始化順序表
void init(SL* s)
{s->a = NULL;s->size = s->capacity = 0;
}
//順序表銷毀
void SLDestory(SL* s)
{assert(s);if(s->a){free(s->a);}s->a = NULL;s->size = s->capacity = 0;
}

2.3順序表的增刪查改

在每次插入時都會面對著是否擴容的問題,因此我們抽離出檢查擴容的函數

//檢查是否滿了
void check(SL* s)
{if (s->size == s->capacity){int new_capacity = (s->capacity == 0) ? 4 : s->capacity * 2;SLDataType* temp = (SLDataType*)realloc(s->a, sizeof(SLDataType) * new_capacity);if (temp == NULL){perror("realloc is fail!");//如果realloc失敗會報錯exit (EXIT_FAILURE);}s->a = temp;s->capacity =new_capacity;}
}
//頭插
void PushFront(SL* s, SLDataType x)
{assert(s);check(s);for (int i =s->size;i>0;i--){s->a[i] =s->a[i-1];}s->a[0] = x;s->size++;
}//尾插
void PushBack(SL* s, SLDataType x)
{assert(s);check(s);s->a[s->size] = x;s->size++;
}//頭刪
void PopFront(SL* s)
{assert(s && s->size);for (int i =0;i<s->size-1;i++){s->a[i] = s->a[i+1];}s->size--;
}//尾刪
void PopBack(SL* s)
{assert(s);assert(s->size);s->size--;
}//任意位置的插入
void Insert(SL* s, int pos, SLDataType x)
{assert(pos >= 0 && pos <= s->size);check(s);for (int i = s->size; i > pos; i--){s->a[i] = s->a[i - 1];}s->a[pos] = x;s->size++;
}//任意位置的刪除,pos是下標
void Erase(SL* s, int pos)
{assert(s);assert(pos >= 0 && pos < s->size);for (int i = pos; i < s->size; i++){s->a[i] = s->a[i + 1];}s->size--;
}//查找元素是否存在,存在返回下標,否則返回-1
int Find(SL* s, SLDataType x)
{assert(s);for (int i = 0; i < s->size; i++){if (x == s->a[i])return i;}return -1;
}

2.4順序表的打印

//打印
void print(SL* s)
{for (int i = 0; i < s->size; i++){printf("%d ", s->a[i]);}printf("\n");
}

三、順序表的源代碼

//order_table.h#pragma once#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>typedef int SLDataType;
//順序表結構體
typedef struct SL
{SLDataType* a;int size;int capacity;
}SL;//初始化順序表
void init(SL *s);
//打印
void print(SL* s);//增刪查改
void PushFront(SL* s,SLDataType x);//頭插void PushBack(SL* s, SLDataType x);//尾插void PopFront(SL* s);//頭刪void PopBack(SL* s);//尾刪void Insert(SL* s, int pos, SLDataType x);//任意位置的插入,pos意為下標void Erase(SL* s, int pos);//任意位置的刪除,pos意為下標int Find(SL* s, SLDataType x);//查找元素是否存在,存在返回下標,否則返回-1void SLDestory(SL* s);
//order_table.c
#include"order_table.h"//順序表結構體
void init(SL* s)
{s->a = NULL;s->size = 0;s->capacity = 0;
}//打印
void print(SL* s)
{for (int i = 0; i < s->size; i++){printf("%d ", s->a[i]);}printf("\n");
}//檢查是否滿了
void check(SL* s)
{if (s->size == s->capacity){int new_capacity = (s->capacity == 0) ? 4 : s->capacity * 2;SLDataType* temp = (SLDataType*)realloc(s->a, sizeof(SLDataType) * new_capacity);if (temp == NULL){perror("realloc is fail!");exit (EXIT_FAILURE);}s->a = temp;s->capacity =new_capacity;}
}
//頭插
void PushFront(SL* s, SLDataType x)
{check(s);for (int i =s->size;i>0;i-- ){s->a[i] =s->a[i-1];}s->a[0] = x;s->size++;
}void PushBack(SL* s, SLDataType x)//尾插
{check(s);s->a[s->size] = x;s->size++;
}void PopFront(SL* s)//頭刪
{assert(s && s->size);for (int i =0;i<s->size-1;i++){s->a[i] = s->a[i+1];}s->size--;
}void PopBack(SL* s)//尾刪
{assert(s);assert(s->size);s->size--;
}void Insert(SL* s, int pos, SLDataType x)//任意位置的插入
{assert(pos >= 0 && pos <= s->size);check(s);for (int i = s->size; i > pos; i--){s->a[i] = s->a[i - 1];}s->a[pos] = x;s->size++;
}void Erase(SL* s, int pos)//任意位置的刪除
{assert(s);assert(pos >= 0 && pos < s->size);for (int i = pos; i < s->size; i++){s->a[i] = s->a[i + 1];}s->size--;
}int Find(SL* s, SLDataType x)//查找元素是否存在,存在返回下標,否則返回-1
{assert(s);for (int i = 0; i < s->size; i++){if (x == s->a[i])return i;}return -1;
}void SLDestory(SL* s)
{assert(s);if(s->a){free(s->a);}s->a = NULL;s->size = s->capacity = 0;
} 

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

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

相關文章

GEE計算遙感生態指數RSEI

目錄 RESI濕度綠度熱度干度源代碼歸一化函數代碼解釋整體的代碼功能解釋:導出RSEI計算結果參考文獻RESI RSEI = f (Greenness,Wetness,Heat,Dryness)其遙感定義為: RSEI = f (VI,Wet,LST,SI)式中:Greenness 為綠度;Wetness 為濕度;Thermal為熱度;Dryness 為干度;VI 為植被指數…

【多媒體】Java實現MP4和MP3音視頻播放器【JavaFX】【音視頻播放】

在Java中播放音視頻可以使用多種方案&#xff0c;最常見的是通過Swing組件JFrame和JLabel來嵌入JMF(Java Media Framework)或Xuggler。不過&#xff0c;JMF已經不再被推薦使用&#xff0c;而Xuggler是基于DirectX的&#xff0c;不適用于跨平臺。而且上述方案都需要使用第三方庫…

拒絕信息差!一篇文章說清Stable Diffusion 3到底值不值得沖

前言 就在幾天前&#xff0c;Stability AI正式開源了Stable Diffusion 3 Medium&#xff08;以下簡稱SD3M&#xff09;模型和適配CLIP文件。這家身處風雨飄搖中的公司&#xff0c;在最近的一年里一直處于破產邊緣&#xff0c;就連創始人兼CEO也頂不住壓力提桶跑路。 即便這樣&…

[leetcode]minimum-absolute-difference-in-bst 二叉搜索樹的最小絕對差

. - 力扣&#xff08;LeetCode&#xff09; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(null…

java如何在字符串中間插入字符串

java在字符串中插入字符串&#xff0c;需要用到insert語句 語法格式為 sbf.insert(offset,str) 其中,sbf是任意字符串 offset是插入的索引 str是插入的字符串 public class Insert {public static void main(String[] args) {// 將字符串插入到指定索引StringBuffer sbfn…

FFmpeg5.0源碼閱讀——格式檢測

摘要&#xff1a;在拿到一個新的格式后&#xff0c;FFmpeg總是能夠足夠正確的判斷格式的內容并進行相應的處理。本文在描述FFmpeg如何進行格式檢測來確認正在處理的媒體格式類型&#xff0c;并進行相應的處理。 ??關鍵字&#xff1a;FFmpeg,format,probe 在調用FFmpeg的APIav…

變量的定義和使用

1.定義 變量&#xff0c;就是用來表示數據的名字 Python 中定義變量非常簡單&#xff0c;只需將數據通過等號()賦值給一個符合命名規范的標識符即可 name"Camille" name 123 變量的使用 變量的使用是指在程序中引用一個已經定義的變量。 例如&#xff0c;如果…

LeetCode 196, 73, 105

目錄 196. 刪除重復的電子郵箱題目鏈接表要求知識點思路代碼 73. 矩陣置零題目鏈接標簽簡單版思路代碼 優化版思路代碼 105. 從前序與中序遍歷序列構造二叉樹題目鏈接標簽思路代碼 196. 刪除重復的電子郵箱 題目鏈接 196. 刪除重復的電子郵箱 表 表Person的字段為id和email…

昇思MindSpore學習總結七——模型訓練

1、模型訓練 模型訓練一般分為四個步驟&#xff1a; 構建數據集。定義神經網絡模型。定義超參、損失函數及優化器。輸入數據集進行訓練與評估。 現在我們有了數據集和模型后&#xff0c;可以進行模型的訓練與評估。 2、構建數據集 首先從數據集 Dataset加載代碼&#xff0…

檢測站機動車授權簽字人試題附答案

16、___的輪胎胎冠上花紋深度不得小于3.2mm。( ) A、乘用車 B、摩托車 C、貨車的轉向輪&#xff08;正確答案&#xff09; D、掛車 17、最大設計時速≥100km/h的機動車其轉向盤自由轉動量不大于__。( ) A、30 度 B、20 度&#xff08;正確答案&#xff09; C、45 度 D、40度…

在windows上安裝objection

安裝命令pip install objection -i https://mirrors.aliyun.com/pypi/simple hook指定進程 objection -g 測試 explore 進程名不定是包名&#xff0c;也可能是app名字&#xff0c;如“測試”就是app的名字 若出現如下錯誤&#xff0c;說明python 缺少setuptools 直接安裝setu…

擲骰子游戲 、 求絕對值,平方根,對數,正弦值 題目

題目 JAVA33 擲骰子游戲分析&#xff1a;代碼&#xff1a; JAVA34 求絕對值&#xff0c;平方根&#xff0c;對數&#xff0c;正弦值分析&#xff1a;代碼&#xff1a; JAVA33 擲骰子游戲 描述開發一個擲骰子游戲&#xff0c;即每次運行程序時&#xff0c;產生一個[1,6]之間的隨…

秋招突擊——設計模式補充——單例模式、依賴倒轉原則、工廠方法模式

文章目錄 引言正文依賴倒轉原則工廠方法模式工廠模式的實現簡單工廠和工廠方法的對比 抽線工廠模式最基本的數據訪問程序使用工廠模式實現數據庫的訪問使用抽象工廠模式的數據訪問程序抽象工廠模式的優點和缺點使用反射抽象工廠的數據訪問程序使用反射配置文件實現數據訪問程序…

檢索增強生成RAG系列6--RAG提升之查詢結構化(Query Construction)

系列5中講到會講解3個方面RAG的提升&#xff0c;它們可能與RAG的準確率有關系&#xff0c;但是更多的它們是有其它用途。本期來講解第二部分&#xff1a;查詢結構化&#xff08;Query Construction&#xff09;。在系列3文檔處理中&#xff0c;我們著重講解了文檔解析&#xff…

C++ dll導出類的方法

要在C動態庫中導出類&#xff0c;可以使用以下步驟&#xff1a; 定義一個類并實現其成員函數。在類的聲明前加上__declspec(dllexport)標記&#xff08;Windows平臺&#xff09;或__attribute__((visibility("default")))標記&#xff08;Linux平臺&#xff09;&…

C語言學習筆記--第一個程序

第一個C語言程序 #include<stdio.h> //引用輸入輸出頭文件&#xff0c;每一次都需要引用這個文件 //.h是頭文件 // .c是源文件 // .cpp是C源文件&#xff0c;兼容C //C的第一個程序 // 行注釋&#xff08;只能注釋這一行&#xff09; /*塊注釋 */ int main() {printf(&…

能保存到相冊的風景視頻在哪下載?下載風景視頻網站分享

在當今以視覺為核心的時代&#xff0c;高清美麗的風景視頻不僅能夠豐富我們的日常生活&#xff0c;還能提供心靈上的慰藉。無論是為了制作視頻項目&#xff0c;還是僅僅想要珍藏一些精美的風景畫面&#xff0c;獲取高質量的風景視頻素材顯得尤為重要。許多人可能會問&#xff1…

PTrade量化軟件常見問題整理系列2

一、研究界面使用get_fundamentals函數報錯&#xff1a;error_info:獲取token失敗&#xff1f; 研究界面使用get_fundamentals函數報錯&#xff1a;error_info:獲取token失敗&#xff1f; 1、測試版本202202.01.052&#xff0c;升級202202.01.051版本后&#xff0c;為了解決不…

在虛擬仿真中學習人工智能,可以達到什么目標?

人工智能已經成為引領社會創新的關鍵力量&#xff0c;想要在這個充滿機遇的領域中脫穎而出&#xff0c;掌握扎實的專業技能和積累豐富的實踐經驗至關重要。然而&#xff0c;許多學習者在追求這一目標的過程中面臨著幾個主要問題&#xff1a;專業技術掌握有難度、實踐經驗積累存…

linux中awk,sed, grep使用

《linux私房菜》這本書中將sed和awk一同歸為行的修改這一點&#xff0c;雖然對&#xff0c;但不利于實際處理問題時的思考。因為這樣的話&#xff0c;當我們實際處理問題時&#xff0c;遇到比如說統計文本打印內容時&#xff0c;我們選擇sed還是awk進行處理呢&#xff1f; 也因…