数据结构之顺序存储线性表实现详解与示例(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.mzph.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的特性…