c++数据结构:线性表的存储结构——顺序表
2017-09-17 22:01
344 查看
顺序表,表示线性表的存储结构为顺序存储,其在使用时会向内存中申请一段连续的存储单元,用单元的下标作为标记位置。其中,数据的类型由于不确定带来一定的数据类型定义需求,所以我们采用c++的模板来实现。
类模板的定义及相关函数的实现:
实例调用:
特点分析:按位查找时:时间复杂度是o(1);其余查找,插入,删除操作皆为0(n)
注意点:表中元素的长度的元素位置和下标并不是相等的,在写成员函数的时候需要特别注意,(第一位元素的下标为0)
关于顺序表暂时写这么多,有错误欢迎指正(及时改正),日后有则补充。
类模板的定义及相关函数的实现:
#pragma once #include<iostream> using namespace std; const int Maxsize = 100; //定义顺序表结构的长度 template<typename T> class seqList { public: seqList(); //构造函数 seqList(T a[],int n); //构造函数 ~seqList(); //析构函数 int seqLength() { return length; } //求当前数组的长度 T seqGet(int n); //按位查找,查找指定位置的元素 int seqLocate(T value); //按值查找,查找指定值的序号 bool seqInsert(T value,int a); //插入操作,在线性表中第i个位置插入值为x的元素 bool seqDelete(int a); //删除操作,删除第i个元素 void seqTraverse(); //遍历操作 bool seqEmpty(); //判空 bool seqFull(); //判满 void seqyuesefu( int m); //约瑟夫问题 private: T iArray[Maxsize]; //待指定类型的长度固定的数组 int length; //当前数组已存放元素的长度 }; template<typename T> seqList<T>::seqList() //无参的构造函数 { length = 0; } template<typename T> seqList<T>::seqList(T a[], int n) /*带参的构造函数*/ { for (int i = 0; i < n; i++) { iArray[i] = a[i]; } length = n; } template<typename T> /*析构函数*/ seqList<T>::~seqList() { } template<typename T> T seqList<T>::seqGet(int n) /*按位查找,接收位置变量a,返回该元素为该下标的元素*/ { return iArray ; } template<typename T> int seqList<T>::seqLocate(T value) /*按值查找,接收外部输入的值a,然后遍历该顺序表,若找到某一个匹配的值,则返回该元素的位置,缺点:若该表中有多个匹配的值,则之后返回第一个匹配值的位置,日后有需要可进一步优化*/ { for (int i = 0; i < length; i++) { if (value == iArray[i]) { return i+1; } } cout << "未找到所输入的值" << endl; } template<typename T> bool seqList<T>::seqInsert(T value, int a) /*插入函数,接收外部变量(要插入的数的值,插入的位置),然后将要插入的位置以后的元素(包括该位置)向后移位,然后覆盖该位置的元素(此时该位置的元素已经依次后移),长度加一*/ { if (seqFull()) { return false; } if (a > Maxsize || a < 0) { return false; } for (int i =length; i > a-1; i--) { iArray[i] = iArray[i-1]; } iArray[a-1] = value; length++; return true; } template<typename T> bool seqList<T>::seqDelete(int a) /*删除函数,输入某位置的元素,函数一次循环遍历,并将该位置上的元素覆盖,然后元素长度减一*/ { if (seqEmpty()) { return false; } if (a>Maxsize||a<1) { return false; } for (int i = a-1; i < length; i++) { iArray[i] = iArray[i+1]; } length--; return true; } template<typename T> void seqList<T>::seqTraverse() /*遍历函数,依次循环顺序表中的元素,并将他们输出*/ { for (int i = 0; i < length; i++) { cout << iArray[i] << ","; } } template<typename T> //判空队列,判断当前队列是否为空队列(没有存储元素) bool seqList<T>::seqEmpty() { return length == 0 ? true : false; } template<typename T> //判满队列,判断队列中的元素个数是否已达最大值 bool seqList<T>::seqFull() { return length == Maxsize ? true : false; } template<typename T> void seqList<T>::seqyuesefu(int m) /*约瑟夫环问题,用顺序表解决约瑟夫问题*/ { int out; int b = 0; cout << "原队列的数组顺序为" << endl; seqTraverse(); cout << "出队顺序为:" << endl; while (length>0) { if (length < m) { out = m%length - b; while (out <= 0) { out += length; } cout << iArray[out - 1]<<","; b = length - out; seqDelete(out); } else if (length>=m) { if (b >= m) { out = length - b + m; } else if (b < m) { out = m-b; } cout << iArray[out - 1] << ","; b = length - out; seqDelete(out); } } }
实例调用:
#include<iostream> #include"seqList.h" using namespace std; int main() { int a[5] = {1,2,3,4,5}; seqList<int> iArra(a, 5); iArra.seqInsert(2, 4); //插入函数成功 iArra.seqTraverse(); //遍历函数测试成功 iArra.seqDelete(4); //删除函数 cout << endl; iArra.seqTraverse(); cout<<endl<<iArra.seqLocate(4); /*查找函数测试成功*/ cout << endl << "当前长度为:" << iArra.seqLength(); //返回长度函数调用成功 iArra.seqyuesefu(100); return 0; }
特点分析:按位查找时:时间复杂度是o(1);其余查找,插入,删除操作皆为0(n)
注意点:表中元素的长度的元素位置和下标并不是相等的,在写成员函数的时候需要特别注意,(第一位元素的下标为0)
关于顺序表暂时写这么多,有错误欢迎指正(及时改正),日后有则补充。
相关文章推荐
- C语言数据结构-2.线性表之链式存储结构
- 10-数据结构_线性结构-离散存储-链表_创建与遍历链表
- 数据结构之线性结构的离散存储(单链表)
- 数据结构:线性表的链式存储结构_单链表
- 数据结构一一线性表的链式存储结构之插入与遍历
- 数据结构一一线性表的链式存储结构之整表删除
- C++数据结构之线性顺序表基本操作
- c/c++常用算法(1) -- 数据结构(线性表的顺序存储)
- 07-数据结构_线性结构-连续存储-数组
- 08-数据结构_线性结构-离散存储-链表_1
- 09-数据结构_线性结构-离散存储-链表_插删伪算法
- 数据结构学习笔记之线性结构--离散存储[链表]
- 数据结构线性结构之连续存储---数组
- 结构算法 001 线性表的顺序存储--顺序表
- 数据结构一一线性表的链式存储结构之删除操作
- 数据结构_串_用链表做存储结构实现KMP算法_C++实现
- 【数据结构】线性结构:存储&运算&时间复杂度
- 《数据结构》(C语言版)——线性表的单链表存储结构
- 数据结构_图_邻接表做存储结构实现求无向图的连通分量_C++实现
- 线性表、顺序表、链表、线性表的逻辑结构和线性表的存储结构的概念和特点