C++实现数据结构的顺序表详解

目录
  • 前言:
  • 代码
    • 1.SeqList.h
    • 2.SeqList.cpp
    • 3.test.cpp
  • 总结

前言:

hello,大家好,这篇文章博主来分享一下C++实现数据结构中的顺序表的代码。希望对大家有所帮助。

在博主之前的文章中,已经详细地写过顺序表,读者可以点击查看C语言如何建立链表并实现增删查改,在之前的文章中,是用C语言来实现的,这篇文章中,我们用C++来实现。

代码

1.SeqList.h

#ifndef SEQLIST_H
#define SEQLIST_H
#include<iostream>
using namespace std;
template<class T,int MAXSIZE>
class SeqList
{
	T data[MAXSIZE];
	int length;
public:
	SeqList();
	SeqList(T a[],int n);
	~SeqList();
	int ListLength();
	T Get(int pos);
	int Locate(T item);
	void SeqPrint();
	void Insert(int i, T item);
	T Delete(int i);
};
#endif

2.SeqList.cpp

#define _CRT_SECURE_NO_WARNINGS   1
#include"SeqList.h"
template<class T, int MAXSIZE>
SeqList<T,MAXSIZE>::SeqList()
{
	length = 0;
}
template<class T, int MAXSIZE>
SeqList<T, MAXSIZE>::SeqList(T a[], int n)
{
	if (n < MAXSIZE)
	{
		length = n;
		for (int i = 0; i < n; i++)
		{
			data[i] = a[i];
		}
	}
	else
	{
		cerr << "您的数据已经超过范围,系统无法继续工作" << endl;
		exit(-1);
	}
}
template<class T, int MAXSIZE>
SeqList<T, MAXSIZE>::~SeqList()
{
}
template<class T, int MAXSIZE>
int SeqList<T, MAXSIZE>::ListLength()
{
	return length;
}
template<class T, int MAXSIZE>
T SeqList<T, MAXSIZE>::Get(int pos)
{
	if (pos > length || pos < 0)
	{
		cerr << "您要查找的位置不存在,系统无法继续为您服务" << endl;
		exit(-1);
	}
	else
	{
		return data[pos - 1];
	}
}
template<class T, int MAXSIZE>
int SeqList<T, MAXSIZE>::Locate(T item)
{
	for (int i = 0; i < length; i++)
	{
		if (data[i] == item)
			return i + 1;
	}
	return -1;
}
template<class T, int MAXSIZE>
void SeqList<T, MAXSIZE>::SeqPrint()
{
	for (int i = 0; i < length; i++)
	{
		cout << data[i] << "  ";
	}
	cout << endl;
}
template<class T, int MAXSIZE>
void SeqList<T, MAXSIZE>::Insert(int i, T item)
{
	if (length < MAXSIZE)
	{
		for (int j = length - 1; j>=i - 1; j--)
		{
			data[j + 1] = data[j];
		}
		data[i - 1] = item;
		length++;
	}
	else
	{
		cerr << "抱歉,当前已经达到系统最大的储存,无法为您插入" << endl;
		exit(-1);
	}
}
template<class T, int MAXSIZE>
T SeqList<T, MAXSIZE>::Delete(int i)
{
	if (length == 0)
	{
		cerr << "当前无可删除元素" << endl;
		exit(-1);
	}
	if (i<1 || i>length)
	{
		cerr << "该位置非法" << endl;
		exit(-1);
	}
	T x = data[i - 1];
	for (int j = i; j < length; j++)
	{
		data[j - 1] = data[j];
	}
	length--;
	return x;
}

3.test.cpp

#define _CRT_SECURE_NO_WARNINGS   1
#include"SeqList.cpp"
#include<iostream>
using namespace std;
void menu()
{
	cout << "|------------------------------------|" << endl;
	cout << "|----------- 欢迎来到顺序表 ---------|" << endl;
	cout << "|---------------1.插入---------------|" << endl;
	cout << "|---------------2.删除---------------|" << endl;
	cout << "|---------------3.求长---------------|" << endl;
	cout << "|---------------4.取值---------------|" << endl;
	cout << "|---------------5.定位---------------|" << endl;
	cout << "|---------------6.打印---------------|" << endl;
	cout << "|---------------0.退出---------------|" << endl;
	cout << "|------------------------------------|" << endl;
}
int main()
{
	int *a;
	int n;
	cout << "请输入您要构造的顺序表的长度" << endl;
	cin >> n;
	a = new int[n];
	cout << "请输入该顺序表中的每一个元素" << endl;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	SeqList<int, 20>seq(a, n);
	cout << "现在开始我们的程序之旅" << endl;
	int input=0;
	do
	{
		menu();
		cout << "输入您要进行的操作的编号" << endl;
		cin >> input;
		switch (input)
		{
		case 1:
			cout << "请输入您要插入的位置和数值" << endl;
			int pos;
			int value;
			cin >> pos;
			cin >> value;
			seq.Insert(pos,value);
			break;
		case 2:
			cout << "请输入您要删除的位置" << endl;
			int pos1;
			cin >> pos1;
			cout << "您删除的元素的值为:";
			cout << seq.Delete(pos1) << endl;
			break;
		case 3:
			cout << "您的顺序表当前的长度为:" << seq.ListLength() << endl;
			break;
		case 4:
			cout << "请输入您要查找的位置" << endl;
			int pos2;
			cin >> pos2;
			cout << "您查找的元素的值为:";
			cout << seq.Get(pos2) << endl;;
			break;
		case 5:
			cout << "请输入您要查找的元素" << endl;
			int item;
			cin >> item;
			cout << "您查找的元素的位置为:";
			cout << seq.Locate(item) << endl;;
			break;
		case 6:
			cout << "当前顺序表如下:" << endl;
			seq.SeqPrint();
			break;
		case 0:
			cout << "程序退出,感谢使用" << endl;
			exit(-1);
			break;
		default :
			cout << "您的输入有误,请重新选择" << endl;
		}
	} while (input);
	return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C++实现顺序表的常用操作(插入删出查找输出)

    实现顺序表的插入,删除,查找,输出操作在C语言中经常用到.下面小编给大家整理实现代码,一起看下吧 代码如下所示: #include<iostream> using namespace std; #define MAXSIZE 15 typedef int DataType; typedef struct { DataType data[MAXSIZE]; //通常用一位数组来描述顺序表的数据存储 int SeqLength; /*线性表长度*/ } SeqList; SeqList *Init

  • C++实现顺序表的方法

    废话不多说了,直接给大家上关键代码了. #pragma once #include <assert.h> template<class T> class SeqList { public: SeqList() :_a(NULL) ,_size(1) ,_capacity(1) {} SeqList(T* a, size_t size) :_a(new T[size]) ,_size(size) ,_capacity(size) { for (size_t i = 0; i <

  • C++顺序表的实例代码

    本文实例为大家分享了C++实现顺序表的具体代码,供大家参考,具体内容如下 #include <iostream> using namespace std; typedef int DataType; class SeqList { public: SeqList() :_a(NULL) , _size(0) , _capacity(0) {} SeqList(const SeqList& s) :_a(new DataType[s._size]) , _size(s._size) ,

  • C++顺序表的基本操作(使用模版类)

    本文实例为大家分享了C++顺序表的基本操作,供大家参考,具体内容如下 一.遇到问题: 原因:类的函数定义不能放在SeqList.cpp中,必须放在Seqlist.h(类的函数声明和定义放在同一个文件下)中,否则 会出现以下问题. 二.实现程序: 1.SeqList.h #ifndef SeqList_h #define SeqList_h #include <iostream> using namespace std; const int defaultSize = 100; template

  • C++实现动态顺序表(vector)

    vector是连续存储结构,支持随机的高效的随机和在尾部进行插入.删除操作,其它位置的插入.删除操作相对来说效率较低. vector相当于一个数组,但它的数组空间大小需要写一程序来实现. 它的内存分配原理大概可分为下面几步: 1)首先分配一块内存空间进行存储: 2)当所需存储的数据超过分配的空间时,再重新分配一块空间: 3)将旧元素复制到新空间: 4)释放旧空间. 实现代码如下: vector.h #pragma once #include<stdio.h> #include<asser

  • C++实现动态顺序表

    本文实例为大家分享了C++实现动态顺序表的具体代码,供大家参考,具体内容如下 Vector.h #pragma once #include <stdio.h> #include <iostream> #include <assert.h> #include <string.h> using namespace std; typedef int DataType; class Vector { public: Vector() :_first(NULL) ,

  • C++实现数据结构的顺序表详解

    目录 前言: 代码 1.SeqList.h 2.SeqList.cpp 3.test.cpp 总结 前言: hello,大家好,这篇文章博主来分享一下C++实现数据结构中的顺序表的代码.希望对大家有所帮助. 在博主之前的文章中,已经详细地写过顺序表,读者可以点击查看C语言如何建立链表并实现增删查改,在之前的文章中,是用C语言来实现的,这篇文章中,我们用C++来实现. 代码 1.SeqList.h #ifndef SEQLIST_H #define SEQLIST_H #include<iostr

  • C语言数据结构哈希表详解

    /* * 程序名:hash.c,此程序演示哈希表的实现,数据元素单链表带头结点. * */ #include <stdio.h> #include <stdlib.h> #include <string.h> // 哈希表中数据元素的结构体. typedef struct Element { unsigned int key; // 关键字. int value; // 数据元素其它数据项,可以是任意数据类型. // char value[1001]; // 数据元素其

  • C++数据结构哈希表详解

    目录 实现 散列函数 开散列方法 闭散列方法(开地址方法) 删除* 实现 哈希表,即散列表,可以快速地存储和查询记录.理想哈希表的存储和查询时间都是 O(1). 本<资料>中哈希表分以下几部分:散列函数.存储和查找时的元素定位.存储.查找.删除操作因为不常用,所以只给出思想,不给出代码. 根据实际情况,可选择不同的散列方法. 以下代码假设哈希表不会溢出. // N表示哈希表长度,是一个素数,M表示额外空间的大小,empty代表"没有元素". const int N=9997

  • C语言实现动态顺序表详解

    目录 什么是顺序表? 1. 定义顺序表结构体: 2. 初始化顺序表: 3. 销毁顺序表: 4. 打印顺序表: 5. 判断容量+扩容: 6. 头插数据: 7. 尾插数据: 8. 指定下标位置插入数据: 9. 删除数据: 10. 尾删数据: 11. 指定下标位置删除数据: 12. 查找数据: 13. 修改数据: 14. 源代码: 1. SeqList.h: 2. SeqList.cpp: 3. test.cpp: 15. 测试: 总结 什么是顺序表? 顺序表是在计算机内存中以数组的形式保存的线性表,

  • C#数据结构之顺序表(SeqList)实例详解

    本文实例讲述了C#数据结构之顺序表(SeqList)实现方法.分享给大家供大家参考,具体如下: 线性结构(Linear Stucture)是数据结构(Data Structure)中最基本的结构,其特征用图形表示如下: 即:每个元素前面有且只有一个元素(称为"前驱"),同样后面有且只有一个元素(称为"后继")--注:起始元素的前驱认为是空,末尾元素的后继认为也是空,这样在概念上就不冲突了. 线性表(List)是线性结构的一种典型实现,它又可以分为:顺序表(SeqLi

  • Python数据结构与算法之跳表详解

    目录 0. 学习目标 1. 跳表的基本概念 1.1 跳表介绍 1.2 跳表的性能 1.3 跳表与普通链表的异同 2. 跳表的实现 2.1 跳表结点类 2.2 跳表的初始化 2.3 获取跳表长度 2.4 读取指定位置元素 2.5 查找指定元素 2.6 在跳表中插入新元素 2.7 删除跳表中指定元素 2.8 其它一些有用的操作 3. 跳表应用 3.1 跳表应用示例 0. 学习目标 在诸如单链表.双线链表等普通链表中,查找.插入和删除操作由于必须从头结点遍历链表才能找到相关链表,因此时间复杂度均为O(

  • Java数据结构之顺序表和链表精解

    目录 前言 1. 顺序表 代码实现 2. 链表 链表图解 代码实现 前言 两个数据结构:顺序表和链表 数据结构是一门学科,和语言无关. 数据 + 结构:一种描述和组织数据的方式. 1. 顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储.在数组上完成数据的增删查改.其逻辑上和物理上都是连续的. 问题引入:一个数组放在这,我们如何才能自己不去数,让程序自己进行计数? 答:在引入变量,每次放一个元素就更新一次.(如下图,为问题的示意) 也就是说顺序表的底层

  • Python数据结构之顺序表的实现代码示例

    顺序表即线性表的顺序存储结构.它是通过一组地址连续的存储单元对线性表中的数据进行存储的,相邻的两个元素在物理位置上也是相邻的.比如,第1个元素是存储在线性表的起始位置LOC(1),那么第i个元素即是存储在LOC(1)+(i-1)*sizeof(ElemType)位置上,其中sizeof(ElemType)表示每一个元素所占的空间. 追加直接往列表后面添加元素,插入是将插入位置后的元素全部往后面移动一个位置,然后再将这个元素放到指定的位置,将长度加1删除是将该位置后面的元素往前移动,覆盖该元素,然

  • C语言数据结构之单向链表详解分析

    链表的概念:链表是一种动态存储分布的数据结构,由若干个同一结构类型的结点依次串连而成. 链表分为单向链表和双向链表. 链表变量一般用指针head表示,用来存放链表首结点的地址. 每个结点由数据部分和下一个结点的地址部分组成,即每个结点都指向下一个结点.最后一个结点称为表尾,其下一个结点的地址部分的值为NULL(表示为空地址). 特别注意:链表中的各个结点在内存中是可以不连续存放的,具体存放位置由系统分配. 例如:int *ptr ; 因此不可以用ptr++的方式来寻找下一个结点. 使用链表的优点

  • Java数据结构之散列表详解

    目录 介绍 1 散列表概述 1.1 散列表概述 1.2 散列冲突(hash collision) 2 散列函数的选择 2.1 散列函数的要求 2.2 散列函数构造方法 3 散列冲突的解决 3.1 分离链接法 3.2 开放定址法 3.3 再散列法 4 散列表的简单实现 4.1 测试 介绍 本文详细介绍了散列表的概念.散列函数的选择.散列冲突的解决办法,并且最后提供了一种散列表的Java代码实现. 数组的特点是寻址容易,插入和删除困难:而链表的特点是寻址困难,插入和删除容易.而对于tree结构,它们

随机推荐