c++顺序表类模板及其可视化界面

2023-10-31

概要

  本文包括利用c++编写的顺序表的类模板以及其可视化界面。

整体架构流程

  1. 在sqList.h头文件中定义一个SqList类模板,并在类模板中声明构造函数、析构函数和要实现的成员函数;
  2. 在sqList.cpp文件中给出所有函数的定义;
  3. 在顺序表.cpp文件中完成可视化界面的设计。

技术名词解释

  • 顺序表:

        顺序表是一种基本的线性数据结构,它采用连续的存储空间来存储元素。顺序表中的元素按照顺序依次存储,每个元素在内存中占据固定大小的存储空间。

        在顺序表中,元素的插入、删除和访问操作相对简单高效。通过使用数组或固定大小的内存块,顺序表可以实现随机访问,即通过下标直接访问任意位置的元素,时间复杂度为O(1)。

顺序表的特点包括:

  1. 索引访问:顺序表支持通过索引直接访问元素,通过下标可以快速访问顺序表中的元素。

  2. 连续存储:顺序表使用连续的存储空间,元素在内存中的存储位置是相邻的。这也使得顺序表在内存中占用的空间比较大,并且在插入和删除元素时需要移动其他元素。

  3. 定长限制:顺序表的长度在创建时就确定了,无法动态调整大小。如果需要增加或减少容量,需要重新创建一个更大或更小的顺序表,并将元素复制到新表中。

  4. 插入和删除效率低:在顺序表中插入或删除元素时,需要移动其他元素来保持顺序表的连续性。这涉及到元素的复制或移动操作,时间复杂度为O(n),其中n是元素个数。

        顺序表适用于对访问频繁、插入和删除操作较少的场景,例如按位置随机查找元素的需求较多的情况。然而,如果需要频繁进行插入和删除操作,顺序表的性能可能较差,需要考虑使用其他数据结构,如链表。

  • c++类模板

        C++类模板是一种通用的编程工具,用于创建可以适应多种数据类型的类或函数。类模板允许在定义类时使用参数化类型,这样可以根据不同的类型生成具体的类。

        类模板使用 <template> 关键字定义,并在尖括号内指定一个或多个模板参数。模板参数可以是类型、常量或其他模板,用于在类的定义中表示占位符。

实现代码

sqList.h文件:

#pragma once
#include<iostream>
#include<ctime>
using namespace std;
template <class T>
class SqList {
private:
	T* elem;
	int length;
	int listsize;
public:
	SqList(int m);           //构造函数,创建容量为m的空表
	~SqList();               //析构函数,删除表空间
	void CreateList(int n);  //创建具有n个元素的线性表
	void Insert(int i, T e); //在表中第i个位置插入元素
	T Delete(int i);         //删除表中第i个元素的值
	T GetElem(int i);        //获取第i个元素的值
	int Locate(T e);         //元素定位
	void Clear();            //清空表
	int Empty();             //测表空
	int Full();              //测表满
	int Length();            //测表长
	void ListDisplay();      //输出表元素
};

sqList.cpp文件:

#include"sqList.h"


template <class T>
SqList<T>::SqList(int m)          //构造函数,创建容量为m的空表
{
	elem = new T[m];
	if (!elem)
		throw "内存分配失败";
	length = 0;
	listsize = m;
}


template <class T>
SqList<T>::~SqList()               //析构函数,删除表空间
{
	delete [] elem;
	length = 0;
	listsize = 0;
}


template <class T>
void SqList<T>::CreateList(int n)  //创建具有n个元素的线性表
{
	if (n > listsize)
		throw "表长超过表空间,创建失败";
	srand((unsigned int)time(NULL));
	for (int i = 0; i < n; i++)
		elem[i] = rand() % 101;
	length = n;
}


template <class T>
void SqList<T>::Insert(int i, T e) //在表中第i个位置插入元素
{
	if (length >= listsize)
		throw "上溢";
	if (i<1 || i>length + 1)
		throw "插入位置异常";
	for (int j = length; j >= i; j--)
		elem[j] = elem[j - 1];
	elem[i - 1] = e;
	length++;
}


template <class T>
T SqList<T>::Delete(int i)         //删除表中第i个元素的值
{
	if (length <= 0)
		throw "下溢";
	if (i<1 || i>length)
		throw "删除位置异常";
	T a = elem[i - 1];
	for (int j = i - 1; j < length - 1; j++)
		elem[j] = elem[j + 1];
	length--;
	return a;
}


template <class T>
T SqList<T>::GetElem(int i)        //获取第i个元素的值
{
	if (length <= 0)
		throw "空表无法获取元素值";
	if (i<1 || i>length)
		throw "访问位置异常";
	return elem[i - 1];
}


template <class T>
int SqList<T>::Locate(T e)         //元素定位
{
	for (int i = 0; i < length; i++)
		if (elem[i] == e)
			return i + 1;
	return 0;
}


template <class T>
void SqList<T>::Clear()            //清空表
{
	length = 0;
}


template <class T>
int SqList<T>::Empty()             //测表空
{
	if (length == 0)
		return 1;
	return 0;
}


template <class T>
int SqList<T>::Full()              //测表满
{
	if (length == listsize)
		return 1;
	return 0;
}


template <class T>
int SqList<T>::Length()            //测表长
{
	return length;
}


template <class T>
void SqList<T>::ListDisplay()      //输出表元素
{
	if (length == 0)
		cout << "空表!!!" << endl;
	else
		for (int i = 0; i < length; i++)
			cout << "表中第" << (i + 1) << "个元素值为:" << elem[i] << endl;
}

顺序表.cpp文件:

#include"sqList.h"
//使用类模板时需要把函数的声明和定义都写在.h头文件中,如果非要分开写,需要把.cpp源文件引入
#include"sqList.cpp"
#include<conio.h>
#define ListSize 10


void menu() {
	cout << "***************************************" << endl;
	cout << "*****  1.创建具有n个元素的线性表  *****" << endl;
	cout << "*****  2.在表中第i个位置插入元素  *****" << endl;
	cout << "*****  3.删除表中第i个元素的值    *****" << endl;
	cout << "*****  4.获取第i个元素的值        *****" << endl;
	cout << "*****  5.元素定位                 *****" << endl;
	cout << "*****  6.清空表                   *****" << endl;
	cout << "*****  7.测表空                   *****" << endl;
	cout << "*****  8.测表满                   *****" << endl;
	cout << "*****  9.测表长                   *****" << endl;
	cout << "*****  0.输出表元素               *****" << endl;
	cout << "*****        其他键退出           *****" << endl;
	cout << "***************************************" << endl;
}


int main() {

	//创建顺序表对象
	SqList<int> sqlist(ListSize);

	while (true) {
			//菜单
			menu();

			//用户选择
			try {
				char key = _getch();
				switch (key) {


				case '1'://1.创建具有n个元素的线性表
				{
					system("cls");
					cout << "*****1.创建具有n个元素的线性表*****" << endl;
					int n;
					cout << "请输入元素个数n:" << endl;
					cin >> n;
					sqlist.CreateList(n);
					cout << "创建成功!" << endl;
				}
				break;


				case '2'://2.在表中第i个位置插入元素
				{
					system("cls");
					cout << "*****2.在表中第i个位置插入元素*****" << endl;
					int i, e;
					cout << "请输入插入位置i:" << endl;
					cin >> i;
					cout << "请输入插入元素:" << endl;
					cin >> e;
					sqlist.Insert(i, e);
					cout << "插入成功!" << endl;
				}
				break;


				case '3'://3.删除表中第i个元素的值
				{
					system("cls");
					cout << "*****3.删除表中第i个元素的值  *****" << endl;
					int i;
					cout << "您想删除第几个元素?" << endl;
					cin >> i;
					int e = sqlist.Delete(i);
					cout << "已删除第" << i << "个元素:" << e << endl;
				}
					break;


				case '4'://4.获取第i个元素的值  
				{
					system("cls");
					cout << "*****4.获取第i个元素的值      *****" << endl;
					int i;
					cout << "您想获取第几个元素?" << endl;
					cin >> i;
					int e=sqlist.GetElem(i);
					cout << "获取成功!" << endl;
					cout << "表中第" << i << "个元素值为:" << e << endl;
				}
					break;


				case '5'://5.元素定位 
				{
					system("cls");
					cout << "*****5.元素定位               *****" << endl;
					int e;
					cout << "请输入需要定位的元素:" << endl;
					cin >> e;
					if (sqlist.Locate(e)) {
						cout << "定位成功!" << endl;
						cout << "该元素在表中第" << sqlist.Locate(e) << "个位置" << endl;
					}
					else {
						cout << "表中不存在该元素" << endl;
					}
				}
					break;


				case '6'://6.清空表 
				{
					system("cls");
					cout << "*****6.清空表                 *****" << endl;
					cout << "是否清空?按“1”清空,其他键取消操作" << endl;
					char clear;
					clear = _getch();
					if (clear == '1') {
						sqlist.Clear();
						cout << "清空成功!" << endl;
					}
					else {
						cout << "取消操作成功!" << endl;
					}

				}
					break;


				case '7'://7.测表空
				{
					system("cls");
					cout << "*****7.测表空                 *****" << endl;
					cout << (sqlist.Empty() ? "表空" : "表非空") << endl;
				}
					break;


				case '8'://8.测表满 
				{
					system("cls");
					cout << "*****8.测表满                 *****" << endl;
					cout << (sqlist.Full() ? "表满" : "表未满") << endl;
				}
					break;


				case '9'://9.测表长 
				{
					system("cls");
					cout << "*****9.测表长                 *****" << endl;
					cout << "该表长度为:" << sqlist.Length() << endl;
				}
					break;


				case '0'://0.输出表元素
				{
					system("cls");
					cout << "*****0.输出表元素             *****" << endl;
					sqlist.ListDisplay();
				}
					break;


				default:
				{
					system("cls");
					cout << "欢迎下次使用!" << endl;
					system("pause");
					return 0;
				}
				break;
				}
			}
			catch (const char* s) {
				cout << s << endl;
			}
			system("pause");
			system("cls");
		
	}


	system("pause");
	return 0;
}

小结

        本文代码使用的IDE工具为Visual Studio 2019。本文代码中“创建具有n个元素的线性表”的功能是利用随机生成的随机数来对顺序表进行填充。作者是个菜鸟,欢迎各位大佬留言指错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++顺序表类模板及其可视化界面 的相关文章

  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现

随机推荐

  • 安全帽识别 安全帽佩戴效果 安全帽检测 yolov4安全帽识别 yolov3

    施工场景下的行为识别领域 该应用领域在技术上可拆分为两部分 视频跟踪和行为识别 这一周密集调研了文献 发现着实是一个大坑 其中的视频跟踪最近的各頂会论文出现最多的是单目标跟踪 而我们要解决的确是多目标跟踪 最近出的较好的能实用性的是deep
  • react+umi+antdesign+typescript从零构建后台系统

    确保电脑有node 查看方式 node v 2 确保电脑有umi 查看方式 umi v 没有umi的安装方式 npm install g umi 3 执行以下代码 npm create umi 文件名 或者 yarn create umi
  • 不要在问了!工作六年总结的Java面试题与经验

    前言 最近看到很多小伙伴都在因为面试烦恼 所以小编总结了一些面试经验 希望能帮助到大家 一 面试到底在问些什么东西 首先你要知道 面试官的提问和你简历上写的内容是紧密联系的 所以你简历上写的技能一定要会 一般面试包括下面几方面知识类型 Ja
  • 解决[Vue warn]: Error in v-on handler: “TypeError: Cannot read property ‘validate‘ of undefined“

    在做前后端登录时出现下列错误 解决如下 this refs loginForm validate 中的与ref loginForm 名字要相同 或者要定义这个ref 没有定义或者名称不一致都会出现上述错误
  • 你的数字藏品可能真的只是一张图片

    国外 NFT 市场的火爆也同样引燃了国内的市场 像腾讯 阿里等诸多大厂纷纷入局 同时 大量中小企业也在这些头部企业的带领下聚集而来 出于政策风险隐患的防范要求 国内的区块链并不是国外的公链 而是由一个或多个机构独立部署的联盟链 同时也将 N
  • CMD查看当前文件路径下的所有文件名

    介绍 我们知道Linux系统下查看当前文件路径下的所有文件名 可以用ls或ll来查看 那么CMD中怎么查看当前路径下的所有文件呢 方案 使用 dir 命令即可 效果如下
  • Go语言编程思想3——错误处理和资源管理

    Go语言编程思想3 错误处理和资源管理 资源管理 及时关闭文件 及时释放资源 如果打开的文件还未关闭就因为出错而在中间跳出 就无法保证有效的资源管理 因此在这里两者一起进行考虑 一 defer调用 调用在函数结束时发生 在return pa
  • echarts 调整x类目轴axisLabel间距

    场景 产品认为x轴的刻度太密集 需要稀一点 调研 关于这个需求 想到的有 xAxis interval 指定的是所有横坐标的间隔 需要自行计算间隔多少 xAxis splitNumber 对类目轴不生效 xAxis axisLabel fo
  • 【java 程序设计实训】学生请假管理系统

    学生请假管理系统 运行结果 学生请假管理系统需求分析 GUI 编程 事件处理 数据库编程 部分代码 项目结构 实体类 Admin java LeaveData java UserLogin java MainWindow java leav
  • 嵌入式linux 第二章:软件下载

    嵌入式linux 目录 第一章 vi 使用 第二章 软件下载 第三章 软件下载 嵌入式linux 一 软件下载模式 1 deb 1 1 下载 1 2 删除 2 apt get 2 1 下载 2 2 删除 2 3 清除缓存 查询软件包信息 一
  • 每日一题:订单编号

    订单编号 题目 Daimayuan Online Judge 一开始想用二分答案的 但是后来发现不行 二分答案每找到一个值 就要去掉它的左半边或右半边 但是这里不能去 错误代码 include
  • C++(CMake)视觉OpenCV-Raspberry Pi图像处理-3D图像重建-面部界标检测-卷积神经网络车牌自动识别-深度神经网络面部检测和识别

    演示如何为桌面和小型嵌入式系统 如 Raspberry Pi 编写一些图像处理过滤器 使用 SfM 模块将场景重建为稀疏点云 包括相机位姿 以及如何使用多视图立体获取密集点云 使用人脸模块进行人脸界标 也称为人脸标记 检测的过程 图像分割和
  • SpringBoot系统整理

    写在前面 很早之前看了狂神的springboot快速入门 后来发现还是有很多开发知识点需要补充学习 乘着假期 将基础篇 运维实用篇 开发实用篇 原理篇一口气学习巩固 再次记录下学习笔记 系列笔记在springboot中哦 目录 1 快速上手
  • 【基于协同过滤算法的电影推荐】

    目录 1 协同过滤算法 1 1 CF与 User Item 推荐算法区别 1 2 UserCF 1 3 ItemCF 2 评价指标 3 基于userCF与itemCF电影推荐 3 1 MovieLens数据集 3 2 userCF代码实现
  • Qt 5.15 安装步骤

    Qt 5 15 安装步骤 简单介绍 1 利用 MaintenanceTool exe 卸载Qt 2 卸载完成后重新安装 配置Visual Studio 2019 简单介绍 之前一直使用Qt 5 14 0版本 但是由于打包问题以及工作需要 要
  • python下timer定时器常用的两种实现方法

    前言 大家早好 午好 晚好吖 欢迎光临本文章 话不多说 直接开搞 如果有什么疑惑 资料需要的可以点击文章末尾名片领取源码 方法一 使用线程中现成的 这种一般比较常用 特别是在线程中的使用方法 下面是一个例子能够很清楚的说明它的具体使用方法
  • 解决ROS系统 rosdep update超时问题的新方法

    由于近期国内Github Raw的可用IP越来越少 通过修改hosts文件解决rosdep update超时问题的方法已经不太好用 本文通过修改rosdep源码中下载资源的函数来解决这一问题 网站https ghproxy com 支持gi
  • 从键盘输入一个字符串与一个指定字符,将字符串中出现的指定字符全部删除...

    include stdio h include conio h include string h void prochar char str char c char p for p str p 0 p if p c str p str 0
  • 基于深度学习的图像超分辨率重建技术的研究

    基于深度学习的图像超分辨率重建技术的研究 图像的超分辨率重建技术指的是将给定的低分辨率图像通过特定的算法恢复成相应的高分辨率图像 随着人工智能的不断发展 超分辨率重建技术在视频图像压缩传输 医学成像 遥感成像 视频感知与监控等领域得到了广泛
  • c++顺序表类模板及其可视化界面

    文章目录 概要 整体架构流程 技术名词解释 实现代码 小结 概要 本文包括利用c 编写的顺序表的类模板以及其可视化界面 整体架构流程 在sqList h头文件中定义一个SqList类模板 并在类模板中声明构造函数 析构函数和要实现的成员函数