(數據結構)順序表實現-增刪查改

1.線性表

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

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

2.順序表

2.1概念及結構

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

順序表就是數組,但是在數組的基礎上,它還要數據是連續存儲的,不能跳躍間隔。

#pragma once
#define N 100
typedef int SLDataType;//靜態順序表
typedef struct SeqList
{SLDataType arr[N];int size;//表示數組中存了多少個數據
}SL;//接口函數
//靜態特點:滿了就不讓插入,很難確定給多少空間void SeqListInit(SL* ps);
//尾插
void SeqListPushBack(SL* ps, SLDataType x);
//尾刪
void SeqListPopBack(SL* ps);
//頭插
void SeqListPushFront(SL* ps, SLDataType x);
//頭刪
void SeqListPopFront(SL* ps);

靜態順序表不夠靈活,我們接下來要學習的是動態順序表;

學習動態順序表前先說一個我犯過的錯誤,希望你們可以避一下

所以要傳的是地址

順序表一般可以分為:

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

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

3.順序表的實現

3.1尾插:在順序表末尾插入數據

實現步驟:

1.檢查空間是否足夠,不足需要繼續開辟空間

1.1如果容量為0先分配一個初始容量,后面容量不夠可以進行2倍擴容

1.2通過realloc開辟空間,將這個空間的地址賦值給一個定義的指針變量

1.3如果這個指針變量為NULL,即空間開辟失敗進行相應的保護

1.4令順序表的空間地址等于定義的指針變量,同時將新的容量賦值給原容量

2.空間足夠

2.1將數據直接插入當前順序表尾部

2.2++當前的有效數據個數

void SeqListPushBack(SL* ps, SLDataType x)
{//當空間為0或空間不夠時,要開辟空間if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* tmp=(SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));if (tmp == NULL){perror(realloc);exit(-1);//不可以寫return -1;因為return沒有終止掉程序}ps->a = tmp;ps->capacity = newcapacity;}//空間充足,直接插入數據即可ps->a[ps->size] = x;ps->size++;
}

如果對動態內存管理的函數不太了解可以看看我這一篇文章:

理清C語言中動態內存管理相關函數-CSDN博客

3.2尾刪

直接減小size就行

void SeqListPopBack(SL* ps)
{//兩種方式都可以/*if (ps->size > 0){ps->size--;}*/assert(ps->size > 0);ps->size--;
}

3.3頭插

和尾插一樣,先判斷空間是否充足

為了方便我直接將擴容的功能封裝成一個函數

void SeqListCheckcapacity(SL* ps)
{//當空間為0或空間不夠時,要開辟空間if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));if (tmp == NULL){perror(realloc);exit(-1);//不可以寫return -1;因為return沒有終止掉程序}ps->a = tmp;ps->capacity = newcapacity;}
}

頭插數據最簡單的方法就是把現在數組的數據都往后挪一位,再把要插入的數據放在順序表頭部

void SeqListPushFront(SL* ps, SLDataType x)
{SeqListCheckcapacity(ps);//挪動數據int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;
}

3.4頭刪

從第二個數據開始往前挪,覆蓋第一個數據,然后size-1

void SeqListPopFront(SL* ps)
{assert(ps->size > 0);int start = 0;while (start < ps->size-1){ps->a[start] = ps->a[start + 1];start++;}ps->size--;
}

3.5搜尋數據

遍歷一遍順序表即可

//找到了返回x位置的下標,沒有找到返回-1
int SeqListFind(SL* ps, SLDataType x)
{int j = -1;for (int i = 0; i < ps->size; i++){if (ps->a[i] == x){j = i;}}return j;
}

3.6在指定位置插入數據

和頭插的邏輯一樣,也是將數據往后挪

void SeqListInsert(SL* ps, int pos, SLDataType x)
{assert(pos >= 0 || pos <= ps->size);SeqListCheckcapacity(ps);//空間充足int end = ps->size-1;while (end >=pos){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;}

3.7刪除指定位置的數據

//刪除pos位置的數據
void SeqListErase(SL* ps, int pos)
{SeqListCheckcapacity(ps);int start = pos;while (start < ps->size - 1){ps->a[start] = ps->a[start + 1];start++;}ps->size--;
}

3.9銷毀順序表

void SeqListDestory(SL* ps)
{free(ps->a);ps->a = NULL;ps->capacity = ps->size = 0;
}

完整的工程:

main.c

#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"void TestList1();int main()
{TestList1();return 0;
}void TestList1()
{SL plist;SeqListInit(&plist);SeqListPushBack(&plist, 1);SeqListPushBack(&plist, 2);SeqListPushBack(&plist, 3);SeqListPushBack(&plist, 4);SeqListPushBack(&plist, 5);//        ListPushFront(plist, 0);SeqListPrint(&plist);}

SeqList.h

#pragma once //防止重復包含#include <stdio.h>
#include <stdlib.h>
#include <assert.h>typedef int SLDataType;//動態順序表
typedef struct SeqList
{SLDataType* a;      //指向開辟數組的指針int size;                        //表示數組中存了多少個數據int capacity;                //數組實際能存數據的空間容量是多大
}SL;//接口函數
//初始化
void SeqListInit(SL* ps);
//尾插
void SeqListPushBack(SL* ps, SLDataType x);
//尾刪
void SeqListPopBack(SL* ps);
//頭插
void SeqListPushFront(SL* ps, SLDataType x);
//頭刪
void SeqListPopFront(SL* ps);
//找到了返回x位置的下標,沒有找到返回-1
int SeqListFind(SL* ps, SLDataType x);
//指定pos下標位置插入
void SeqListInsert(SL* ps, int pos, SLDataType x);
//刪除pos位置的數據
void SeqListErase(SL* ps, int pos);//打印順序表
void SeqListPrint(SL* ps);
//銷毀順序表
void SeqListDestory(SL* ps);
//查看順序表空余的容量
void SeqListCheckcapacity(SL* ps);

SeqList.c

#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"//初始化
void SeqListInit(SL* ps)
{ps->a = NULL;ps->size = ps->capacity = 0;
}void SeqListDestory(SL* ps)
{free(ps->a);ps->a = NULL;ps->capacity = ps->size = 0;
}void SeqListPrint(SL* ps)
{for (int i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}void SeqListCheckcapacity(SL* ps)
{//當空間為0或空間不夠時,要開辟空間if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));if (tmp == NULL){//perror(realloc);exit(-1);//不可以寫return -1;因為return沒有終止掉程序}ps->a = tmp;ps->capacity = newcapacity;}
}//尾插:在順序表末尾插入數據
void SeqListPushBack(SL* ps, SLDataType x)
{//當空間為0或空間不夠時,要開辟空間if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));if (tmp == NULL){//perror(realloc);exit(-1);//不可以寫return -1;因為return沒有終止掉程序}ps->a = tmp;ps->capacity = newcapacity;}//空間充足,直接插入數據即可ps->a[ps->size] = x;ps->size++;
}//尾刪
void SeqListPopBack(SL* ps)
{//兩種方式都可以/*if (ps->size > 0){ps->size--;}*/assert(ps->size > 0);ps->size--;
}//頭插
void SeqListPushFront(SL* ps, SLDataType x)
{SeqListCheckcapacity(ps);//挪動數據int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;
}
//頭刪
void SeqListPopFront(SL* ps)
{assert(ps->size > 0);int start = 0;while (start < ps->size - 1){ps->a[start] = ps->a[start + 1];start++;}ps->size--;
}//找到了返回x位置的下標,沒有找到返回-1
int SeqListFind(SL* ps, SLDataType x)
{int j = -1;for (int i = 0; i < ps->size; i++){if (ps->a[i] == x){j = i;}}return j;
}//指定pos下標位置插入
void SeqListInsert(SL* ps, int pos, SLDataType x)
{assert(pos >= 0 || pos <= ps->size);SeqListCheckcapacity(ps);//空間充足int end = ps->size - 1;while (end >= pos){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;}//刪除pos位置的數據
void SeqListErase(SL* ps, int pos)
{SeqListCheckcapacity(ps);int start = pos;while (start < ps->size - 1){ps->a[start] = ps->a[start + 1];start++;}ps->size--;
}

上一篇:

算法的時間復雜度和空間復雜度_算法復雜度 計算復雜度和存儲復雜度-CSDN博客

下一篇:

(數據結構)鏈表-CSDN博客

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

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

相關文章

【面試八股總結】線程/進程同步問題

一、同步與互斥 在線程并發執行的過程中&#xff0c;進程/線程之間存在協作的關系&#xff0c;例如有互斥、同步的關系。為了實現進程/線程間正確的協作&#xff0c;操作系統必須提供實現進程協作的措施和方法&#xff0c;主要的方法有兩種&#xff1a; 鎖&#xff1a;加鎖、解…

大語言模型提示工程與應用:提示工程入門指南

提示工程入門 學習目標 在本課程中&#xff0c;我們將學習提示工程。 相關知識點 提示工程 學習內容 1 提示工程 提示工程是一門新興學科&#xff0c;專注于設計和優化提示詞以高效利用語言模型完成多樣化任務。掌握提示工程能幫助開發者更深入理解大語言模型(LLM)的能力…

PostgreSQL 多級依賴血緣系統的設計與落地

一、業務背景&#xff1a;三類指標與四種狀態指標類型定義規則依賴關系原子指標單表聚合&#xff08;SELECT WHERE GROUP&#xff09;無派生指標在原子/派生指標上加 WHERE、改 GROUP依賴 1~N 個父指標復合指標多個原子/派生指標做加減運算依賴 1~N 個父指標狀態說明已保存草…

阿里云百煉平臺創建智能體-上傳文檔

整體思路是&#xff1a; 1創建ram用戶&#xff0c;授權 2上傳文件獲取FileSession 3調用智能體對話&#xff0c;傳入FileSession 接下來每個步驟的細節&#xff1a; 1官方不推薦使用超級管理員用戶獲得accessKeyId和accessKeySecret&#xff0c;所以登錄超級管理員賬號創建…

剪映里面導入多張照片,p圖后如何再導出多張照片?

剪映普通版本暫時沒發現可以批量導出圖片。這里采用其他方式實現。先整體導出視頻。這里前期要注意設置幀率&#xff0c;一張圖片的時長。 參考一下設置&#xff0c;幀率設置為30&#xff0c;圖片導入時長設置為1s&#xff0c;這樣的話&#xff0c;方便后期把視頻切割為單幀。導…

怎么查看Linux I2C總線掛載了那些設備?

1. 根據系統啟動查看設備樹節點文件&#xff08;系統運行后的&#xff09; 比如&#xff1a;要查看I2C2i2c2: i2cfeaa0000 {compatible "rockchip,rk3588-i2c", "rockchip,rk3399-i2c";reg <0x0 0xfeaa0000 0x0 0x1000>;clocks <&cru CLK_…

bat腳本實現獲取非微軟官方服務列表

Get-CimInstance -ClassName Win32_Service |Where-Object { $_.State -eq Running -and $_.StartMode -ne Disabled } | ForEach-Object {$isMicrosoft $false$signerInfo 無可執行路徑if ($_.PathName) {# 提取可執行文件路徑&#xff08;處理帶引號/參數的路徑&#xff09…

小程序難調的組件

背景。做小程序用到了自定義表單。前后端都是分開寫的&#xff0c;沒有使用web-view。所以要做到功能對稱時間選擇器。需要區分datetime, year, day等類型使用uview組件較方便 <template><view class"u-date-picker" v-if"visible"><view c…

從零構建TransformerP2-新聞分類Demo

歡迎來到啾啾的博客&#x1f431;。 記錄學習點滴。分享工作思考和實用技巧&#xff0c;偶爾也分享一些雜談&#x1f4ac;。 有很多很多不足的地方&#xff0c;歡迎評論交流&#xff0c;感謝您的閱讀和評論&#x1f604;。 目錄引言1 一個完整的Transformer模型2 需要準備的“工…

qt qml實現電話簿 通訊錄

qml實現電話簿&#xff0c;基于github上開源代碼修改而來&#xff0c;增加了搜索和展開&#xff0c;效果如下 代碼如下 #include <QGuiApplication> #include <QQmlApplicationEngine>int main(int argc, char *argv[]) {QCoreApplication::setAttribute(Qt::AA_…

順序表——C語言

順序表實現代碼解析與學習筆記一、順序表基礎概念順序表是線性表的一種順序存儲結構&#xff0c;它使用一段連續的內存空間&#xff08;數組&#xff09;存儲數據元素&#xff0c;通過下標直接訪問元素&#xff0c;具有隨機訪問的特性。其核心特點是&#xff1a;元素在內存中連…

【Oracle篇】Oracle Data Pump遠程備份技術:直接從遠端數據庫備份至本地環境

&#x1f4ab;《博主主頁》&#xff1a;    &#x1f50e; CSDN主頁__奈斯DB    &#x1f50e; IF Club社區主頁__奈斯、 &#x1f525;《擅長領域》&#xff1a;擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控&#xff1b;并對…

Linux系統--文件系統

大家好&#xff0c;我們今天繼續來學習Linux系統部分。上一次我們學習了內存級的文件&#xff0c;下面我們來學習磁盤級的文件。那么話不多說&#xff0c;我們開始今天的學習&#xff1a; 目錄 Ext系列?件系統 1. 理解硬件 1-1 磁盤、服務器、機柜、機房 1-2 磁盤物理結構…

KUKA庫卡焊接機器人氬氣節氣設備

在焊接生產過程中&#xff0c;氬氣作為一種重要的保護氣體被廣泛應用于KUKA庫卡焊接機器人的焊接操作中。氬氣的消耗往往是企業生產成本的一個重要組成部分&#xff0c;因此實現庫卡焊接機器人節氣具有重要的經濟和環保意義。WGFACS節氣裝置的出現為解決這一問題提供了有效的方…

遠程連接----ubuntu ,rocky 等Linux系統,WindTerm_2.7.0

新一代開源免費的終端工具-WindTerm github 27.5k? https://github.com/kingToolbox/WindTerm/releases/download/2.7.0/WindTerm_2.7.0_Windows_Portable_x86_64.zip 主機填寫你自己要連接的主機ip 端口默認 22 改成你ssh文件配置的端口 輸入遠程的 用戶名 與密碼 成功連接…

筆試——Day32

文章目錄第一題題目思路代碼第二題題目&#xff1a;思路代碼第三題題目&#xff1a;思路代碼第一題 題目 素數回文 思路 模擬 構建新的數字&#xff0c;判斷該數是否為素數 代碼 第二題 題目&#xff1a; 活動安排 思路 區間問題的貪?&#xff1a;排序&#xff0c;然…

超高車輛如何影響城市立交隧道安全?預警系統如何應對?

超高車輛對立交隧道安全的潛在威脅在城市立交和隧道中&#xff0c;限高設施的設計通常考慮到大部分正常通行的貨車和運輸車輛。然而&#xff0c;一些超高的貨車、集裝箱車或特殊車輛如果未經有效監測而進入限高區域&#xff0c;就可能對道路設施造成極大的安全隱患。尤其在立交…

解決 MinIO 上傳文件時報 S3 API Requests must be made to API port錯誤

在使用 MinIO 進行文件上傳時&#xff0c;我遇到了一個比較坑的問題。錯誤日志如下&#xff1a; io.minio.errors.InvalidResponseException: Non-XML response from server. Response code: 400, Content-Type: text/xml; charsetutf-8, body: <?xml version"1.0&quo…

linux_https,udp,tcp協議(更新中)

目錄 https 加密類型 對稱加密 非對稱加密 加密方案 只用對程加密 只用非對程加密 雙方都是用非對程加密 非對稱對稱加密 非對稱對稱加密證書 流程圖 校驗流程圖 udp udp協議格式 特點 UDP緩沖區 tcp tcp協議格式 32位序號及確認序號 4位首部 6位標志位 1…

web端-登錄頁面驗證碼的實現(springboot+vue前后端分離)超詳細

目錄 一、項目技術棧 二、實現效果圖 ?三、實現路線 四、驗證碼的實現步驟 五、完整代碼 1.前端 2.后端 一、項目技術棧 登錄頁面暫時涉及到的技術棧如下: 前端 Vue2 Element UI Axios&#xff0c;后端 Spring Boot 2 MyBatis MySQL JWT Maven 二、實現效果圖…