數據結構之順序存儲線性表實現詳解與示例(C,C#,C++)

文章目錄

  • 一、順序存儲線性表的基本概念
  • 二、順序存儲線性表的實現
    • 1、數據結構定義
    • 2、初始化
    • 3、添加元素
    • 4、訪問元素
    • 5、修改元素
    • 6、刪除元素
    • 7、銷毀
  • 三、示例
    • C語言示例
    • C#語言示例
    • C++語言示例

在這里插入圖片描述


順序存儲線性表是一種基本的數據結構,它將線性表的元素按照一定的順序存放在一組地址連續的存儲單元中。在這篇博客中,我們將詳細介紹順序存儲線性表的實現,并以C、C#和C++三種編程語言為例,展示如何實現一個順序存儲線性表。

一、順序存儲線性表的基本概念

順序存儲線性表是一種線性表的實現方式,它具有以下特點:

元素類型相同:順序存儲線性表中的元素類型相同,每個元素占用一定的存儲空間。
元素有序:順序存儲線性表中的元素按照一定的順序排列,通常為非遞減順序。
隨機訪問:順序存儲線性表支持隨機訪問,即可以通過索引直接訪問表中的任意元素。
動態擴展:順序存儲線性表可以根據需要動態地擴展存儲空間,以容納更多元素。

二、順序存儲線性表的實現

1、數據結構定義

首先,我們需要為順序存儲線性表定義一個數據結構。以C語言為例,可以使用結構體(struct)來定義:

#include <stdio.h>
#include <stdlib.h>typedef struct {int *data; // 指向動態分配的數組int size;  // 線性表的當前長度int capacity; // 線性表的容量
} SequenceList;

2、初始化

初始化順序存儲線性表,為其分配初始容量。在C語言中,我們可以使用malloc函數動態分配內存:

void initSequenceList(SequenceList *list, int capacity) {list->data = (int *)malloc(capacity * sizeof(int));if (list->data == NULL) {exit(-1); // 內存分配失敗,退出程序}list->size = 0;list->capacity = capacity;
}

3、添加元素

向順序存儲線性表中添加元素。如果當前容量不足以容納新元素,需要先擴展容量:

void appendSequenceList(SequenceList *list, int value) {if (list->size == list->capacity) {// 擴展容量int newCapacity = list->capacity * 2;int *newData = (int *)malloc(newCapacity * sizeof(int));if (newData == NULL) {exit(-1); // 內存分配失敗,退出程序}for (int i = 0; i < list->size; i++) {newData[i] = list->data[i];}free(list->data);list->data = newData;list->capacity = newCapacity;}list->data[list->size++] = value;
}

4、訪問元素

訪問順序存儲線性表中的指定元素:

int getSequenceList(const SequenceList *list, int index) {if (index < 0 || index >= list->size) {return -1; // 索引無效,返回-1}return list->data[index];
}

5、修改元素

修改順序存儲線性表中的指定元素:

void setSequenceList(SequenceList *list, int index, int value) {if (index < 0 || index >= list->size) {return; // 索引無效,不進行操作}list->data[index] = value;
}

6、刪除元素

刪除順序存儲線性表中的指定元素:

void removeSequenceList(SequenceList *list, int index) {if (index < 0 || index >= list->size) {return; // 索引無效,不進行操作}for (int i = index + 1; i < list->size; i++) {list->data[i - 1] = list->data[i];}list->size--;
}

7、銷毀

銷毀順序存儲線性表,釋放分配的內存:

void destroySequenceList(SequenceList *list) {free(list->data);list->data = NULL;list->size = 0;list->capacity = 0;
}

三、示例

下面我們使用C、C#和C++三種編程語言,分別實現一個順序存儲線性表,并添加、刪除、訪問和打印線性表中的元素。

C語言示例

#include <stdio.h>
#include <stdlib.h>typedef struct {int *data;int size;int capacity;
} SequenceList;void initSequenceList(SequenceList *list, int capacity) {list->data = (int *)malloc(capacity * sizeof(int));if (list->data == NULL) {exit(-1);}list->size = 0;list->capacity = capacity;
}void appendSequenceList(SequenceList *list, int value) {if (list->size == list->capacity) {int newCapacity = list->capacity * 2;int *newData = (int *)malloc(newCapacity * sizeof(int));if (newData == NULL) {exit(-1);}for (int i = 0; i < list->size; i++) {newData[i] = list->data[i];}free(list->data);list->data = newData;list->capacity = newCapacity;}list->data[list->size++] = value;
}int getSequenceList(const SequenceList *list, int index) {if (index < 0 || index >= list->size) {return -1;}return list->data[index];
}void setSequenceList(SequenceList *list, int index, int value) {if (index < 0 || index >= list->size) {return;}list->data[index] = value;
}void removeSequenceList(SequenceList *list, int index) {if (index < 0 || index >= list->size) {return;}for (int i = index + 1; i < list->size; i++) {list->data[i - 1] = list->data[i];}list->size--;
}void destroySequenceList(SequenceList *list) {free(list->data);list->data = NULL;list->size = 0;list->capacity = 0;
}int main() {SequenceList list;initSequenceList(&list, 10);appendSequenceList(&list, 1);appendSequenceList(&list, 2);appendSequenceList(&list, 3);printf("Get element at index 1: %d\n", getSequenceList(&list, 1));setSequenceList(&list, 1, 4);printf("Get element at index 1 after modification: %d\n", getSequenceList(&list, 1));removeSequenceList(&list, 0);printf("Get element at index 0 after removal: %d\n", getSequenceList(&list, 0));destroySequenceList(&list);return 0;
}

C#語言示例

using System;public class SequenceList
{private int[] data;private int size;private int capacity;public SequenceList(int capacity){this.data = new int[capacity];this.size = 0;this.capacity = capacity;}public void Append(int value){if (size == capacity){int newCapacity = capacity * 2;int[] newData = new int[newCapacity];for (int i = 0; i < size; i++){newData[i] = data[i];}data = newData;capacity = newCapacity;}data[size++] = value;}public int Get(int index){if (index < 0 || index >= size){return -1;}return data[index];}public void Set(int index, int value){if (index < 0 || index >= size){return;}data[index] = value;}public void RemoveAt(int index){if (index < 0 || index >= size){return;}for (int i = index + 1; i < size; i++){data[i - 1] = data[i];}size--;}public void Clear(){size = 0;}
}class Program
{static void Main(string[] args){SequenceList list = new SequenceList(10);list.Append(1);list.Append(2);list.Append(3);Console.WriteLine("Get element at index 1: " + list.Get(1));list.Set(1, 4);Console.WriteLine("Get element at index 1 after modification: " + list.Get(1));list.RemoveAt(0);Console.WriteLine("Get element at index 0 after removal: " + list.Get(0));list.Clear();}
}

C++語言示例

#include <iostream>class SequenceList {
private:int *data;int size;int capacity;public:SequenceList(int capacity) {data = new int[capacity];size = 0;capacity = capacity;}void Append(int value) {if (size == capacity) {int newCapacity = capacity * 2;int *newData = new int[newCapacity];for (int i = 0; i < size; i++) {newData[i] = data[i];}delete[] data;data = newData;capacity = newCapacity;}data[size++] = value;}int Get(int index) {if (index < 0 || index >= size) {return -1;}return data[index];}void Set(int index, int value) {if (index < 0 || index >= size) {return;}data[index] = value;}void RemoveAt(int index) {if (index < 0 || index >= size) {return;}for (int i = index + 1; i < size; i++) {data[i - 1] = data[i];}size--;}void Clear() {size = 0;}
};int main() {SequenceList list(10);list.Append(1);list.Append(2);list.Append(3);std::cout << "Get element at index 1: " << list.Get(1) << std::endl;list.Set(1, 4);std::cout << "Get element at index 1 after modification: " << list.Get(1) << std::endl;list.RemoveAt(0);std::cout << "Get element at index 0 after removal: " << list.Get(0) << std::endl;list.Clear();return 0;
}

在這三個示例中,我們定義了一個順序存儲線性表類,并提供了一系列基本操作,如添加、刪除、訪問和打印元素。通過這些示例,您可以了解如何在不同的編程語言中實現順序存儲線性表。

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

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

相關文章

Mysql中存儲過程、存儲函數、自定義函數、變量、流程控制語句、光標/游標、定義條件和處理程序的使用示例

場景 存儲過程 存儲過程是一組為了完成特定功能的SQL語句集合。使用存儲過程的目的是將常用或復雜的工作預先用SQL語句寫好并用一個指定名稱存儲起來&#xff0c; 這個過程經編譯和優化后存儲在數據庫服務器中&#xff0c;因此稱為存儲過程。 當以后需要數據庫提供與己定義…

分享WPF的UI開源庫

文章目錄 前言一、HandyControl二、AduSkin三、Adonis UI四、Panuon.WPF.UI五、LayUI-WPF六、MahApps.Metro七、MaterialDesignInXamlToolkit八、FluentWPF九、DMSkin總結 前言 分享WPF的UI開源庫。 一、HandyControl HandyControl是一套WPF控件庫&#xff0c;它幾乎重寫了所…

uni-app 掃描二維碼獲取信息功能

首先是掃描二維碼的功能&#xff0c;可以參考這篇博文 uni-app-H5頁面調用設備攝像頭掃描二維碼_uni-app app端調用攝像頭顯示至指定元素上顯示-CSDN博客 然后現在是可以掃描二維碼的狀態&#xff0c;掃描之后&#xff0c;可以看到首先是出發上一個頁面的事件&#xff0c;然后…

每天一個數據分析題(四百二十五)- 單因素方差分析

關于下表&#xff0c;錯誤說法是&#xff08; &#xff09; A. 這是單因素方差分析的輸出結果 B. 表中 F< F crit, 與 P-value 大于顯著性水平是等價的 C. 表內組間均方差沒有顯著大于組內均方差 D. 由于組內SS數值顯著大于組間SS&#xff0c;因此可以推斷不同分類對于…

使用Python繪制面積圖

使用Python繪制面積圖 面積圖效果代碼 面積圖 面積圖展示數據隨時間的累積變化&#xff0c;適合表現趨勢和總量。通過填充圖形下方的區域&#xff0c;可以直觀地顯示各時間點的數值及其變化。 效果 [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-…

機器學習——決策樹(筆記)

目錄 一、認識決策樹 1. 介紹 2. 決策樹生成過程 二、sklearn中的決策樹 1. tree.DecisionTreeClassifier&#xff08;分類樹&#xff09; &#xff08;1&#xff09;模型基本參數 &#xff08;2&#xff09;模型屬性 &#xff08;3&#xff09;接口 2. tree.Decision…

最新開源免費數字人工具

使用步驟更是簡單到不行&#xff1a; 1. 輸入圖片&#xff1a;選擇你想要生成動態視頻的肖像圖片。 2. 輸入音頻&#xff1a;提供與圖片匹配的音頻文件&#xff0c;EchoMimic會根據音頻內容驅動肖像的動態效果。 3. 設置參數&#xff1a;一般保持默認設置即可&#xff0c;當然&…

排序題目:最小時間差

文章目錄 題目標題和出處難度題目描述要求示例數據范圍 解法思路和算法代碼復雜度分析 題目 標題和出處 標題&#xff1a;最小時間差 出處&#xff1a;539. 最小時間差 難度 3 級 題目描述 要求 給定一個 24 \texttt{24} 24 小時制的時間列表&#xff0c;時間以 &quo…

暗黑魅力:Xcode全面擁抱應用暗黑模式開發指南

暗黑魅力&#xff1a;Xcode全面擁抱應用暗黑模式開發指南 隨著蘋果在iOS 13和iPadOS 13中引入暗黑模式&#xff0c;用戶可以根據自己的喜好或環境光線選擇不同的界面主題。作為開發者&#xff0c;支持暗黑模式不僅能提升用戶體驗&#xff0c;還能彰顯應用的專業性。Xcode提供了…

《夢醒蝶飛:釋放Excel函數與公式的力量》11.4 ISERROR函數

第11章&#xff1a;信息函數 第四節 11.4 ISERROR函數 11.4.1 簡介 ISERROR函數是Excel中的一個信息函數&#xff0c;用于檢查指定單元格或表達式是否產生錯誤。如果單元格或表達式產生任何類型的錯誤&#xff08;如N/A、VALUE!、REF!等&#xff09;&#xff0c;則返回TRUE&…

全開源TikTok跨境商城源碼/TikTok內嵌商城+搭建教程/前端uniapp+后端

多語言跨境電商外貿商城 TikTok內嵌商城&#xff0c;商家入駐一鍵鋪貨一鍵提貨 全開源完美運營 海外版抖音TikTok商城系統源碼&#xff0c;TikToK內嵌商城&#xff0c;跨境商城系統源碼 接在tiktok里面的商城。tiktok內嵌&#xff0c;也可單獨分開出來當獨立站運營 二十一種…

FPGA原型驗證(八):如何選擇現成的原型驗證平臺?

第6章 如何選擇現成的原型驗證平臺? 在第5章中,我們探討了為基于FPGA的原型項目創建FPGA硬件平臺時應考慮的詳細因素。 現在,我們將考慮所謂的“自制還是購買”爭論的另一方面。什么時候使用現成的FPGA板或甚至是更復雜的基于FPGA的系統,而不是設計定制板更有意義? 什么…

leetcode165.解密數字

題目表述&#xff1a; 這道題目和斐波那契數列以及跳臺階問題十分相似。 斐波那契數列&#xff1a;0、1、1、2、3、5, 8、13、21、34 …… leetcode跳臺階問題&#xff1a;1、1、2、3、5, 8、13、21、34....... 這類題目的特點都是第N項的結果等于前兩項的和。 但是解密數…

java 在pdf中根據關鍵字位置插入圖片(公章、簽名等)

java 在pdf中根據關鍵字位置插入圖片&#xff08;公章、簽名等&#xff09; 1.使用依賴 <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.1.12</version><type>pom</type>…

【深度學習】圖形模型基礎(7):機器學習優化中的方差減少方法(1)

摘要 隨機優化是機器學習中至關重要的組成部分&#xff0c;其核心是隨機梯度下降算法&#xff08;SGD&#xff09;&#xff0c;這種方法自60多年前首次提出以來一直被廣泛使用。近八年來&#xff0c;我們見證了一個激動人心的新進展&#xff1a;隨機優化方法的方差降低技術。這…

車載測試資料學習和CANoe工具實操車載項目(每日直播)

每日直播時間&#xff1a;&#xff08;直播方式&#xff1a;騰訊會議&#xff09; 周一到周五&#xff1a;20&#xff1a;00-23&#xff1a;00 周六與周日&#xff1a;9&#xff1a;00-17&#xff1a;00 向進騰訊會議學習的&#xff0c;可以關注我并后臺留言 直播內容&#xff…

Simscape物理建模步驟

為了介紹構建和仿真物理模型的步驟&#xff0c;這里以simulink自帶示例模型Mass-Spring-Damper with Controller為例&#xff0c;下圖為建立好的模型。 詳細物理建模和仿真分析步驟如下&#xff1a; 步驟 1&#xff1a;使用 ssc_new 創建新模型 使用 ssc_new 是開始構建 Sims…

李彥宏所說的卷應用到底是什么?

李彥宏在2024世界人工智能大會上的發言強調了一個重要的觀點&#xff0c;那就是在AI時代&#xff0c;技術的應用比技術本身更為關鍵。他所提出的“卷應用”而非“卷模型”&#xff0c;實際上是在呼吁業界關注AI技術的實際落地和價值創造&#xff0c;而不是單純地在模型精度或規…

【 RESTful API 】

RESTful API 是一種用于構建 web 應用程序的設計風格和架構模式。它提供了通過 HTTP 協議訪問和操作資源的規范方式。 REST&#xff08;Representational State Transfer&#xff09;是一種軟件架構風格&#xff0c;它強調在網絡中以資源的形式進行數據傳輸和狀態管理。RESTfu…

Memcached與Redis:緩存解決方案的較量與選擇

標題&#xff1a;Memcached與Redis&#xff1a;緩存解決方案的較量與選擇 在現代應用架構中&#xff0c;緩存是提升性能的關鍵技術之一。Memcached和Redis作為兩款流行的開源緩存解決方案&#xff0c;它們各自有著獨特的特點和使用場景。本文將深入比較Memcached和Redis的特性…