數據結構 02(線性:順序表)

目錄

線性表

順序表

概念與結構

動態順序表的實現

頭文件的創建

順序表初始化

順序表的擴容

尾插功能

頭插功能

尾刪功能

頭刪功能

查找功能

任意位置前插入

任意位置前刪除

銷毀

動態順序表整體呈現

SeqList.h

SeqList.c


線性表

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

線性表的邏輯結構一定是線性的,但物理結構不一定是線性的。

順序表

概念與結構

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

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

分類:分為靜態順序表和動態順序表(常用)。

動態順序表的實現

頭文件的創建

我們要在頭文件中完成順序表的創建和頭文件與函數的聲明。

typedef int SLDataType;
typedef struct SeqList
{SLDataType* arr;int size;int capacity;
}SL;

這是頭文件的包含和順序表的創建。

這是對函數的聲明,以上函數我們都會講到。

順序表初始化

首先我們要在源文件中包含剛剛我們創建的頭文件。

然后對順序表進行初始化。

void SLInit(SL* ps)//初始化
{ps->arr = NULL;ps->size = ps->capacity = 0;
}

順序表的擴容

現在我們的順序表里面什么都沒有,我們要擴大我們的空間。或者當我們的順序表空間滿了的時候,我們也要擴大我們的空間。

所以我們要先寫好函數對順序表進行擴容。

擴容函數中我們需要使用realloc函數額外申請空間。

注意:進行擴容操作時請用臨時變量,防止發生問題造成不可逆的傷害。

void SLCheckCapacity(SL* ps)//擴容
{if (ps->size == ps->capacity){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;}
}

尾插功能

實現尾插功能很簡單,size剛好是數組最后一個元素的后一個下標,確定指針的安全后直接令arr[size]等于x就完成了。

void SLPushBack(SL* ps,SLDataType x)//尾插
{assert(ps);SLCheckCapacity(ps);ps->arr[ps->size++] = x;
}

頭插功能

頭插功能比尾插復雜一點點,需要讓數組中的元素整體后移一個位置,讓arr[0]空缺起來實現x的插入。

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];}ps->arr[0] = x;++ps->size;
}

尾刪功能

尾刪很簡單,直接讓size減一就好了。

void SLPopBack(SL* ps)//尾刪
{assert(ps && ps->size);--ps->size;
}

頭刪功能

頭刪也很簡單,就讓后面的元素把前面的元素一一覆蓋就好了。

void SLPopFront(SL* ps)//頭刪
{assert(ps && ps->size);for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}--ps->size;
}

查找功能

遍歷數組查找元素,找到返回下標,沒找到返回-1。

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

任意位置前插入

這是建立在頭插的基礎上的,讓pos后的元素一一往后移一個位置把pos空出來實現插入。

void SLInsert(SL* ps, int pos, SLDataType x)//任意位置前插入
{assert(ps);assert(pos >= 0 && pos <= ps->size);for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;++ps->size;
}

任意位置前刪除

和頭刪很相似,讓pos后的元素一一往前移一個位置覆蓋pos。

void SLErase(SL* ps, int pos)//任意位置前刪除
{assert(ps && ps->size);assert(pos >= 0 && pos < ps->size);for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}--ps->size;
}

銷毀

結束后一定要進行函數的銷毀操作。

void SLDesTroy(SL* ps)//銷毀
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->size = ps->capacity = 0;
}

動態順序表整體呈現

SeqList.h

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>typedef int SLDataType;
typedef struct SeqList
{SLDataType* arr;int size;int capacity;
}SL;void SLInit(SL* ps);
void SLDesTroy(SL* ps);
void SListPrint(SL s);
void SLCheckCapacity(SL* ps);
void SLPushBack(SL* ps,SLDataType x);
void SLPushFront(SL* ps, SLDataType x);
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
int SLFind(SL* ps, SLDataType);

SeqList.c

#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"void SLInit(SL* ps)//初始化
{ps->arr = NULL;ps->size = ps->capacity = 0;
}void SListPrint(SL s)//打印
{for (int i = 0; i < s.size; i++){printf("%d ", s.arr[i]);}printf("\n");
}void SLCheckCapacity(SL* ps)//擴容
{if (ps->size == ps->capacity){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;}
}void SLPushBack(SL* ps,SLDataType x)//尾插
{assert(ps);SLCheckCapacity(ps);ps->arr[ps->size++] = x;
}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];}ps->arr[0] = x;++ps->size;
}void SLPopBack(SL* ps)//尾刪
{assert(ps && ps->size);--ps->size;
}void SLPopFront(SL* ps)//頭刪
{assert(ps && ps->size);for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}--ps->size;
}int SLFind(SL* ps, SLDataType x)//查找
{for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x)return i;}return -1;
}void SLInsert(SL* ps, int pos, SLDataType x)//任意位置前插入
{assert(ps);assert(pos >= 0 && pos <= ps->size);for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;++ps->size;
}void SLErase(SL* ps, int pos)//任意位置前刪除
{assert(ps && ps->size);assert(pos >= 0 && pos < ps->size);for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}--ps->size;
}void SLDesTroy(SL* ps)//銷毀
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->size = ps->capacity = 0;
}

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

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

相關文章

自助餐廳:自主取餐的平衡術

自助餐廳&#xff0c;本質是通過 “固定客單價 自主取餐” 的模式&#xff0c;把 “吃什么、吃多少” 的選擇權還給用戶&#xff0c;同時用運營設計平衡 “用戶體驗” 與 “餐廳成本”—— 它不是 “讓用戶吃垮餐廳” 的游戲&#xff0c;而是餐飲行業里 “效率與體驗結合” 的…

TypeScript: Reflect.ownKeys 操作(針對 Symbol)

Reflect.ownKeys 是 JavaScript ES6 引入的 Reflect API 中的一個方法&#xff0c;用于獲取目標對象的所有自身屬性鍵&#xff08;包括字符串鍵和 Symbol 鍵&#xff09;。1.基本概念&#xff1a;Reflect.ownKeys(target)&#xff1a;接受一個對象 target 作為參數&#xff0c;…

一般納稅人

目錄 一文詳解&#xff1a;什么是一般納稅人&#xff1f; 一、核心定義&#xff1a;什么是一般納稅人&#xff1f; 二、成為一般納稅人的兩種途徑 三、一般納稅人的關鍵特點與運作機制 四、一般納稅人的優點與缺點 五、與小規模納稅人的核心區別 六、企業應如何選擇&…

@HAProxy 介紹部署使用

文章目錄**1. HAProxy 簡介****1.1 什么是 HAProxy&#xff1f;****1.2 核心特性****1.3 關鍵術語****2. 安裝 HAProxy****2.1 在 Ubuntu/Debian 上安裝****2.2 在 CentOS/RHEL/Rocky Linux/AlmaLinux 上安裝****3. 配置與使用****3.1 核心配置文件結構****3.2 基礎配置示例&am…

Two-Twer模型做歌曲智能推薦與規則算法對比的優缺點分析

基于規則與機器學習驅動的音樂推薦&#xff1a;核心差異分析1.推薦精度2. 個性化能力3. 模型適應性&#xff08;潛在特征關聯發現&#xff09;4. 可擴展性與復雜性成本5. 冷啟動/數據稀疏階段表現6. 聽感匹配與主觀反饋1.推薦精度 規則推薦&#xff1a; 依賴預設的 if-then 邏…

【完整源碼+數據集+部署教程】停車位狀態檢測系統源碼和數據集:改進yolo11-DCNV2-Dynamic

背景意義 隨著城市化進程的加快&#xff0c;城市交通擁堵問題日益嚴重&#xff0c;停車難成為了許多城市居民面臨的普遍問題。有效的停車管理不僅可以提高城市交通的流動性&#xff0c;還能減少因尋找停車位而造成的時間浪費和環境污染。因此&#xff0c;開發一個高效的停車位狀…

《Password Guessing Using Random Forest》論文解讀

論文填補了傳統統計方法&#xff08;如 PCFG、Markov&#xff09;與深度學習方法&#xff08;如 LSTM、GAN&#xff09;之間的研究空白&#xff0c;提出基于隨機森林的口令猜測框架 RFGuess&#xff0c;覆蓋三種核心猜測場景&#xff0c;為口令安全研究提供了全新技術路線。一、…

項目一系列-第9章 集成AI千帆大模型

第9章 集成AI千帆大模型 學習目標 能夠說清楚健康評估模塊在項目中的作用能夠掌握千帆大模型的開通和對接能夠掌握健康評估模塊中的prompt提示詞編寫能夠自主完成健康評估模塊的接口開發 分析設計 需求說明 健康評估是指老人辦理入住前需上傳體檢報告&#xff0c;由AI自動…

vben admin5組件文檔(豆包版)---VbenTree

VbenTree 用法說明 VbenTree 是 Vben5 中基于 radix-vue 實現的樹形組件&#xff0c;支持單選、多選、展開/折疊、權限控制等功能。以下是其核心用法說明&#xff1a; 1. 基礎引入 import { VbenTree } from vben-core/shadcn-ui;2. 核心屬性&#xff08;Props&#xff09;屬性…

postman常用快捷鍵

作為一名IT程序猿&#xff0c;不懂一些工具的快捷方式&#xff0c;應該會被鄙視的吧。收集了一些Postman的快捷方式&#xff0c;大家一起動手操作~ 1小時postman接口測試從入門到精通教程簡單操作 操作mac系統windows系統 打開新標簽 ?TCtrl T關閉標簽?WCtrl W強制關閉標簽…

【物聯網】什么是 DHT11(數字溫濕度傳感器)?

正面照片&#xff08;藍色傳感器朝上&#xff0c;針腳朝下&#xff09; 絲印標注非常清晰&#xff1a; 左邊 → S &#x1f449; 信號 (DATA) 中間 → &#x1f449; VCC (電源&#xff0c;3.3V 或 5V) 右邊 → - &#x1f449; GND (地) ? 正確接法&#xff08;Arduino Nano…

光譜相機在霧霾監測中有何優勢?

光譜相機在霧霾監測中的優勢主要體現在多維度數據采集和環境適應性方面&#xff0c;結合最新技術進展分析如下&#xff1a;一、核心優勢?穿透性監測能力? 短波紅外&#xff08;SWIR&#xff09;波段可穿透霧霾顆粒&#xff0c;結合可見光成像實現霧霾濃度與能見度的同步監測&…

【c++】超好玩游戲

#include <iostream> #include <vector> #include <conio.h> #include <windows.h> #include <time.h>using namespace std;// 游戲常量 const int WIDTH 40; const int HEIGHT 20; const int PADDLE_WIDTH 5;// 方向枚舉 enum Direction { S…

GitHub 熱榜項目 - 日榜(2025-08-27)

GitHub 熱榜項目 - 日榜(2025-08-27) 生成于&#xff1a;2025-08-27 統計摘要 共發現熱門項目&#xff1a;15 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜呈現出三大技術趨勢&#xff1a;1. AI生產力工具持續升溫&#xff1a;系統提示詞泄露庫、DeepCode…

基于Springboot + vue3實現的學校學報出版發行管理系統

項目描述本系統包含管理員和用戶兩個角色。管理員角色&#xff1a;用戶管理&#xff1a;管理系統中所有用戶的信息&#xff0c;包括添加、刪除和修改用戶。稿件分類管理&#xff1a;管理稿件分類信息&#xff0c;包括新增、查看、修改和刪除稿件分類。新聞資訊管理&#xff1a;…

【Keil5教程及技巧】耗時一周精心整理萬字全網最全Keil5(MDK-ARM)功能詳細介紹【建議收藏-細細品嘗】

&#x1f48c; 所屬專欄&#xff1a;【單片機開發軟件技巧】 &#x1f600; 作??者&#xff1a; 于曉超 &#x1f680; 個人簡介&#xff1a;嵌入式工程師&#xff0c;專注嵌入式領域基礎和實戰分享 &#xff0c;歡迎咨詢&#xff01; &#x1f496; 歡迎大家&#xff1…

國家育兒補貼政策遭利用,黑產組織借機竊取敏感數據

組織概況與作案手法近期網絡安全領域出現了一個高度組織化的犯罪集團UTG-Q-1000&#xff0c;該組織通過利用中國國家育兒補貼政策實施大規模金融詐騙和數據竊取活動。這個結構嚴密的犯罪網絡下設多個專業部門&#xff0c;包括財務組、新聞與色情組、設計與制造組以及黑市交易組…

Python Imaging Library (PIL) 全面指南:PIL高級圖像處理-分割與顏色空間轉換

高級圖像處理&#xff1a;PIL中的圖像分割與顏色空間轉換 學習目標 本課程將深入探討PIL&#xff08;Python Imaging Library&#xff09;中的一些高級功能&#xff0c;包括圖像分割和顏色空間轉換。通過本課程的學習&#xff0c;學員將能夠掌握如何使用PIL進行更復雜的圖像處理…

圖解 OAuth,為什么這樣設計?

OAuth 于 2007 年首次推出。它最初由 Twitter 創建&#xff0c;因為 Twitter 希望能夠允許第三方應用代表用戶發布推文。想象一下&#xff0c;如果今天設計類似的應用&#xff0c;你會怎么做&#xff1f;一種方法是直接要求用戶輸入用戶名和密碼。因此&#xff0c;你創建一個非…

WeakAuras Lua Script ICC (BarneyICC) Simplified Chinese [Mini]

WeakAuras Lua Script ICC &#xff08;BarneyICC&#xff09; Simplified Chinese [Mini] ICC 迷你版本會打了只需要團隊框體高亮提示即可&#xff0c;因為有DBM&#xff0c;就不需要那么多了 !WA:2!S3xc4XrXzI6wkSjzcVSyb4aoKWGaC04ijMdPrsoit0OdRXwxmsYgmWoNTup4rZ0UNr2sKL…