【數據結構初階】順序表專題

在這里插入圖片描述

文章目錄

  • 順序表
  • 1.數據結構相關概念
      • 1、什么是數據結構
      • 2、為什么需要數據結構?
  • 2.順序表
      • 1、順序表的概念及結構
      • 2、順序表分類
      • 3、動態順序表的實現
        • 1.定義一個動態順序表
        • 2.順序表的初始化
        • 3.順序表的銷毀
        • 4.順序表達的尾插
        • 5.順序表的頭插
        • 6.空間大小檢查函數
        • 7.順序表的尾刪
        • 8.順序表的頭刪
        • 9.測試看效果

順序表

1.數據結構相關概念

1、什么是數據結構

數據結構是由“數據”和“結構”兩詞組合?來。
**什么是數據?**常?的數值1、2、3、4…、教務系統?保存的??信息(姓名、性別、年齡、學歷等等)、????眼可以看到的信息(?字、圖?、視頻等等),這些都是數據
什么是結構?
當我們想要使??量使?同?類型的數據時,通過?動定義?量的獨?的變量對于程序來說,可讀性?常差,我們可以借助數組這樣的數據結構將?量的數據組織在?起,結構也可以理解為組織數據的?式。
想要找到草原上名叫“咩咩”的?很難,但是從?圈?找到1號?就很簡單,?圈這樣的結構有效將?群組織起來。
概念:數據結構是計算機存儲、組織數據的?式。數據結構是指相互之間存在?種或多種特定關系
的數據元素的集合。數據結構反映數據的內部構成,即數據由那部分構成,以什么?式構成,以及數據元素之間呈現的結構。

在這里插入圖片描述

在這里插入圖片描述

總結:
1)能夠存儲數據(如順序表、鏈表等結構)

2)存儲的數據能夠?便查找

2、為什么需要數據結構?

在這里插入圖片描述

如圖中所?,不借助排隊的?式來管理客?,會導致客?就餐感受差、等餐時間?、餐廳營業混亂等情況。同理,程序中如果不對數據進?管理,可能會導致數據丟失、操作數據困難、野指針等情況。通過數據結構,能夠有效將數據組織和管理在?起。按照我們的?式任意對數據進?增刪改查等操
作。
最基礎的數據結構:數組。

在這里插入圖片描述

【思考】有了數組,為什么還要學習其他的數據結構?
假定數組有10個空間,已經使?了5個,向數組中插?數據步驟:
求數組的?度,求數組的有效數據個數,向下標為數據有效個數的位置插?數據(注意:這?是否要判斷數組是否滿了,滿了還能繼續插?嗎)…
假設數據量?常龐?,頻繁的獲取數組有效數據個數會影響程序執?效率。
結論:最基礎的數據結構能夠提供的操作已經不能完全滿?復雜算法實現。

2.順序表

1、順序表的概念及結構

順序表是線性表的一種

線性表有物理結構和邏輯結構

線性表的物理結構不一定連續

但邏輯結構一定連續

那什么是線性表呢?

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

線性表指的是具有部分相同特性的?類數據結構的集合

順序表的物理結構跟邏輯結構都是連續的

2、順序表分類

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

? 順序表分類
? 靜態順序表

在這里插入圖片描述

? 動態順序表

在這里插入圖片描述

3、動態順序表的實現

在這里插入圖片描述

先創建1個頭文件用來聲明函數,兩個.c文件,SeqList.c順序表的實現,test.c用來測試

1.定義一個動態順序表
typedef struct SeqList//sequence順序的 
{SLDataType* arr;int size;//有效數據個數int capacity;//空間大小
}SL;//SeqList太長 我們把他換成SL 

因為我們不知道以后使用時要用什么類型的數據,所以我們最好給數據類型起一個別名

typedef int SLDataType;
2.順序表的初始化
void SLInit(SL *s)
{s->arr = NULL;s->size = s->capacity = 0;
}

注意:這里函數傳參一定要用地址傳參

3.順序表的銷毀
void SLDestroy(SL* ps)
{if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}
4.順序表達的尾插
void SLPushBack(SL* ps, SLDataType x)
{assert(ps);//表達式為真,繼續執行 表達式為假 程序報錯//插入之前先看空間夠不夠if (ps->size == ps->capacity)
{//申請空間//只有realloc可以增容//增容通常來說是成倍數的增加 一般是2倍或3倍 不能頻繁增容 會造成性能降低int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));//用臨時變量來接收,防止內存開辟失敗數據丟失if (tmp == NULL){perror("realloc fail");exit(1);//直接退出程序,不再執行}//空間申請成功ps->arr = tmp;ps->capacity = newcapacity;
}ps->arr[ps->size++] = x;	
}

在這里插入圖片描述

5.順序表的頭插
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++;//加了一個數據
}

在這里插入圖片描述

6.空間大小檢查函數

我們注意到在頭插跟尾插中都 檢查了空間的大小

所以我們可以把他封裝成函數

oid SLCheckCapacity(SL* ps)
{if (ps->size == ps->capacity){//申請空間//只有realloc可以增容//增容通常來說是成倍數的增加 一般是2倍或3倍 不能頻繁增容 會造成性能降低int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));if (tmp == NULL){perror("realloc fail");exit(1);//直接退出程序,不再執行}//空間申請成功ps->arr = tmp;ps->capacity = newcapacity;}
}
7.順序表的尾刪
void SLPopBack(SL* ps)
{assert(ps);assert(ps->size);//判斷順序表是否為空//ps->arr[ps->size - 1] = -1;ps->size--;	
}
8.順序表的頭刪
void SLPopFront(SL* ps)
{assert(ps);assert(ps->size);for (int i = 0; i < ps->size-1; i++){ps->arr[i] = ps->arr[i + 1];//逐個向前替換 最后一個是arr[size-2]=arr[size-1]}ps->size--;//這個不能忘
}
9.測試看效果
#include"SeqList.h"
void SLTest01()
{SL sl;SLInit(&sl);//這里要傳地址  傳值(值拷貝) 這都沒有初始化 沒有值SLPushBack(&sl, 1);//尾插SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);SLPrintf(sl);//打印函數 放下文//頭插SLPushFront(&sl, 5);SLPushFront(&sl, 6);SLPrintf(sl);
//尾刪SLPopBack(&sl);SLPrintf(sl);//頭刪SLPopFront(&sl);SLPopFront(&sl);SLPopFront(&sl);SLPrintf(sl);SLDestroy(&sl);//銷毀
}
int main()
{SLTest01();return 0;
}

在這里插入圖片描述

void SLPrintf(SL s)//上文中的打印函數 這里不是對底層的修改 所以傳值即可
{for (int i = 0; i < s.size; i++){printf("%d ", s.arr[i]);}printf("\n");
}

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

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

相關文章

從神經生物學到社會心理學:游戲沉迷機制的深度解構

你是否曾在深夜放下手機時驚覺&#xff1a;"明明只想玩10分鐘&#xff0c;怎么天都亮了&#xff1f;"這不是意志力薄弱的表現&#xff0c;而是價值數十億美元的游戲產業用神經科學精心設計的認知陷阱。 當《王者榮耀》的Victory音效讓你心跳加速&#xff0c;當《原神…

15.集合框架的學習

一、簡介 集合框架&#xff08;Collection Framework&#xff09; 是 Java 提供的一套用于存儲、操作和處理數據集合的標準化架構。它主要位于 java.util 包中&#xff0c;提供了一組 接口 和 實現類&#xff0c;用于操作不同類型的數據集合&#xff0c;如列表&#xff08;List…

【方案分享】展廳智能講解:基于BLE藍牙Beacon的自動講解觸發技術實現

【方案分享】展廳智能講解&#xff1a;基于BLE藍牙Beacon的自動講解觸發技術實現 讓觀眾靠近展品即可自動彈出講解頁面&#xff0c;是智能展廳的核心功能之一。本文將從軟硬件技術、BLE Beacon原理、微信小程序實現、優劣對比與拓展方案五個維度&#xff0c;系統講解“靠近展臺…

微前端架構:從單體到模塊化的前端新革命

在信息技術&#xff08;IT&#xff09;的迅猛發展中&#xff0c;前端開發領域正迎來一場顛覆性的變革 —— 微前端架構&#xff08;Micro - Frontends&#xff09;。2025 年&#xff0c;隨著 Web 應用的復雜性激增、團隊協作需求的增長以及用戶對無縫體驗的期待&#xff0c;微前…

React中常用的鉤子函數:

一. 基礎鉤子 (1)useState 用于在函數組件中添加局部狀態。useState可以傳遞一個參數&#xff0c;做為狀態的初始值&#xff0c;返回一個數組&#xff0c;數組的第一個元素是返回的狀態變量&#xff0c;第二個是修改狀態變量的函數。 const [state, setState] useState(ini…

如何在 Windows 11 或 10 上通過 PowerShell 安裝 Docker Desktop

了解如何使用 PowerShell 或命令提示符在 Windows 11 或 10 上安裝 Docker CLI 和 Docker Desktop GUI,以創建容器運行虛擬機。無需手動訪問網站下載安裝程序,所有操作都將在命令終端完成。 Docker 是一個強大的容器化平臺,允許開發人員將應用程序及其依賴項打包為輕量級容…

Python實例題:人機對戰初體驗Python基于Pygame實現四子棋游戲

目錄 Python實例題 題目 代碼實現 實現原理 游戲邏輯&#xff1a; AI 算法&#xff1a; 界面渲染&#xff1a; 關鍵代碼解析 游戲棋盤渲染 AI 決策算法 勝利條件檢查 使用說明 安裝依賴&#xff1a; 運行游戲&#xff1a; 游戲操作&#xff1a; 擴展建議 增強…

一文詳解 HLS

1 HLS的簡介 1.1 HLS的背景 從 RTMP&#xff08;Real-Time Messaging Protocol&#xff0c;實時消息傳輸協議&#xff09; 到 HLS&#xff08;HTTP Live Streaming&#xff0c;HTTP直播流&#xff09; 的技術演進&#xff0c;本質上是直播協議從 專有協議 向 通用 Web 協議 的…

go 訪問 sftp 服務 github.com/pkg/sftp 的使用踩坑,連接未關閉(含 sftp 服務測試環境搭建)

前言 最近在使用 sftp 服務時&#xff0c;被告知發起了海量的連接&#xff0c;直接把服務器搞崩&#xff0c;ip 被封了。 這是啥情況&#xff1f; golang 寫的代碼&#xff0c;我就正常的訪問 sftp 服務&#xff0c;連接使用過后也都關閉了&#xff0c;咋會出現連接一直連著…

Android 直接通過 app_process 啟動的應用如何使用 Context

文章目錄 一、問題背景二、代碼實現三、代碼詳解 一、問題背景 在 Android 中&#xff0c;可以使用 Android Studio 編寫 Java 應用程序&#xff0c;通過編譯打包成 apk 文件&#xff0c;然后將文件推送至 /data/local/tmp 等可執行的目錄或安裝打包出來的應用&#xff0c;隨后…

【數據結構與算法】LeetCode 每日三題

如果你已經對數據結構與算法略知一二&#xff0c;現在正在復習數據結構與算法的一些重點知識 ------------------------------------------------------------------------------------------------------------------------- 點贊收藏&#x1f308;&#xff0c;每天更新總結文…

深度“求索”:DeepSeek+Dify構建個人知識庫

目錄 前言 環境部署 安裝Docker 安裝Dify 配置Dify 部署知識庫 創建應用 前言 在當今數字化信息爆炸的時代&#xff0c;數據隱私和個性化知識管理成為企業和個人關注的焦點。Dify&#xff0c;作為一款備受矚目的開源 AI 應用開發平臺&#xff0c;為用戶提供了完整的私有…

【Redis8】最新安裝版與手動運行版

目錄 一、直接運行 1. 下載 Redis百度網盤 2. 解壓后直接運行 redis-server.exe?編輯 二、安裝版運行 雙擊 install_redis_service.bat 輸入安裝路徑&#xff08;請提前創建好安裝路徑&#xff09;后直接回車?編輯 下一步直接回車即可&#xff0c;因為是使用配置模板…

@Column 注解屬性詳解

提示&#xff1a;文章旨在說明 Column 注解屬性如何在日常開發中使用&#xff0c;數據庫類型為 MySql&#xff0c;其他類型數據庫可能存在偏差&#xff0c;需要注意。 文章目錄 一、name 方法二、unique 方法三、nullable 方法四、insertable 方法五、updatable 方法六、column…

使用Gemini, LangChain, Gradio打造一個書籍推薦系統 (第二部分)

建立向量嵌入數據庫 from langchain_community.document_loaders import TextLoader from langchain_text_splitters import CharacterTextSplitter from langchain.docstore.document import Document from langchain_chroma.vectorstores import Chromaimport vertexai from…

【Go-4】函數

函數 函數是編程中的基本構建塊&#xff0c;用于封裝可重用的代碼邏輯。Go語言中的函數功能強大&#xff0c;支持多種特性&#xff0c;如多返回值、可變參數、匿名函數、閉包以及將函數作為值和類型傳遞。理解和掌握函數的使用對于編寫高效、可維護的Go程序至關重要。本章將詳…

【已解決】HBuilder X編輯器在外接顯示器或者4K顯示器怎么界面變的好小問題

觸發方式&#xff1a;主要涉及DPI縮放問題&#xff0c;可能在電腦息屏有概率觸發 修復方式&#xff1a; 1.先關掉軟件直接更改屏幕縮放&#xff0c;然后打開軟件&#xff0c;再關掉軟件恢復原來的縮放&#xff0c;再打開軟件就好了 2.(不推薦&#xff09;右鍵HBuilder在屬性里…

spark調度系統核心組件SparkContext、DAGSchedul、TaskScheduler、Taskset介紹

目錄 1. SparkContext2.DAGScheduler3. TaskScheduler4. 協作關系5 TaskSet的定義6. 組件關系說明Spark調度系統的核心組件主要有SparkContext、DAGScheduler和TaskScheduler SparkContext介紹 1. SparkContext 1、資源申請: SparkContext是Spark應用程序與集群管理器(如St…

VSCode+EIDE通過KeilC51編譯,使VSCode+EIDE“支持”C和ASM混編

在使用Keil C51時&#xff0c;要讓Keil C51支持混編則需要在混編的.c文件上右鍵選擇Options for File *(ALTF7)&#xff0c;打開選項界面后&#xff0c;在 Properties 頁 勾上 Generate Assembler SRC File 和 Assemble SRC File &#xff0c;如下圖所示&#xff1a; 這樣設置后…

SQLynx:一款跨平臺的企業級數據庫管理工具

SQLynx 是一款支持跨平臺&#xff08;Windows、Linux、macOS、Web&#xff09;的企業級數據庫管理和 SQL 工具&#xff0c;可以提供高效、安全且適配國產化技術棧的數據庫管理解決方案。 數據源 SQLynx 支持連接各種關系型數據庫、非關系型數據庫以及大數據平臺&#xff0c;包…