SequentialList.h
#include<iostream>
using namespace std;
const int MAXSIZE = 200;//线性表的最大长度
template <class DataType>
class SequentialList
{
public:
SequentialList();//无参数构造函数
SequentialList(DataType a[], int n);//有参数构造函数:用含n个元素的数组初始化线性表
~SequentialList();//析构函数
int GetLength();//获得线性表长度
int GetLocationByValue(DataType x);//按元素的值查找返回元素位置【下标】
bool IsEmpty();//判断线性表是否为空
DataType GetValueByLocation(int i);//按位查找返回线性表的第i个元素
DataType DeleteByLocation(int i);//删除线性表的第i个元素并返回删除的值
DataType DeleteAtHead();//删除头部元素
DataType DeleteAtTail();//删除尾部元素
DataType GetMaxElement();//获得线性表的最大元素
DataType GetMinElement();//获得线性表的最小元素
DataType Josephus(SequentialList<DataType> seq, int m);//约瑟夫环问题:从第一个元素seq.data[0]开始报数,报到m的出局,返回最后一个出局的元素的值【不是对应的下标】
void GetJosephusSequence(SequentialList<DataType> seq, int m);//获得约瑟夫环问题序列
void Insert(int i, DataType x);//按位插入元素
void InsertAtHead(DataType x);//在头部插入元素
void InsertAtTail(DataType x);//在尾部插入元素
void SetValueAtLocation_iBy_x(int i, DataType x);//设置位置i的元素的值为x
void PrintSequentialList();//遍历线性表
void ClearSequentialList();//清空线性表
void ReverseSequentialList();//倒置【反转】线性表
void LeftRotate_kBit_I(int k);//线性表循环左移k位 #时间复杂度【O(kn)】 #空间复杂度【O(1)】
void SegmentationReverseSequentialList(int from, int to);//分段倒置线性表:倒置下标从from到to的元素
void LeftRotate_kBit_II(int k);//线性表循环左移k位 #时间复杂度【O(3n)】 #空间复杂度【O(1)】
void MergeIncrementally(SequentialList<DataType> A, SequentialList<DataType> B, SequentialList<DataType> &C);//递增合地并顺序表A和B并存储在C中
void SequentialListByInsertSort();//线性表从小到大排序
private:
int length;//线性表长度
DataType data[MAXSIZE];//存入数据元素的数组
};
SequentialList.cpp
#include"SequentialList.h"
template<class DataType>
SequentialList<DataType>::SequentialList()
{
length = 0;
}
template<class DataType>
SequentialList<DataType>::SequentialList(DataType a[], int n)
{
if (n > MAXSIZE) {
cout << "initial error!" << endl;
return;
}
for (int i = 0; i < n; i++) {
data[i] = a[i];
}
length = n;
}
template<class DataType>
SequentialList<DataType>::~SequentialList()
{
}
template<class DataType>
int SequentialList<DataType>::GetLength()
{
return length;
}
template<class DataType>
int SequentialList<DataType>::GetLocationByValue(DataType x)
{
if ( length==0 ) {
cout << "get error!" << endl;
return -1;
}
for (int i = 0; i < length; i++) {
if (data[i] == x) return i + 1;
}
cout << "get error!" << endl;
return -1;
}
template<class DataType>
bool SequentialList<DataType>::IsEmpty()
{
if (length == 0)
return true;
else
return false;
}
template<class DataType>
DataType SequentialList<DataType>::GetValueByLocation(int i)
{
if ((i > length) || i<1) {
cout << "get error!" << endl;
return -1;
}
return data[i-1];
}
template<class DataType>
DataType SequentialList<DataType>::DeleteByLocation(int i)
{
if ((i > length) || i<1 || length==0) {
cout << "delete error!" << endl;
return -1;
}
int j = i - 1;
DataType delete_value = data[j];
for (;j<length-1; j++) {
data[j] = data[j + 1];
}
length--;
return delete_value;
}
template<class DataType>
DataType SequentialList<DataType>::DeleteAtHead()
{
if (length==0) {
cout << "delete error!" << endl;
return -1;
}
DataType delete_value = data[0];
for (int j=0; j<length - 1; j++) {
data[j] = data[j + 1];
}
length--;
return delete_value;
}
template<class DataType>
DataType SequentialList<DataType>::DeleteAtTail()
{
if (length == 0) {
cout << "delete error!" << endl;
return -1;
}
length--;
return data[length+1];
}
template<class DataType>
DataType SequentialList<DataType>::GetMaxElement()
{
if (length == 0) {
cout << "get error!" << endl;
return -1;
}
DataType max = data[0];
for (int i = 1; i < length; i++) {
if (data[i] > max)max = data[i];
}
return max;
}
template<class DataType>
DataType SequentialList<DataType>::GetMinElement()
{
if (length == 0) {
cout << "get error!" << endl;
return -1;
}
DataType min = data[0];
for (int i = 1; i < length; i++) {
if (data[i] < min)min = data[i];
}
return min;
}
template<class DataType>
DataType SequentialList<DataType>::Josephus(SequentialList<DataType> seq, int m)
{
int i;
DataType *array = new DataType[seq.length];
for (i = 0; i < seq.length; i++) {//复制data到array,这样可以不破坏原始数据
array[i] = seq.data[i];
}
int start = 0;//start为每次报数的起始点
for (i = seq.length; i >= 2; i--) {
start = (start + m - 1) % i;//采用取模运算使报数从表尾回到表头
for (int j = start + 1; j < i; j++) {
array[j - 1] = array[j];
}
}
DataType temp = array[0];
delete[] array;
return temp;
}
template<class DataType>
void SequentialList<DataType>::GetJosephusSequence(SequentialList<DataType> seq, int m)
{
int i;
DataType *array = new DataType[seq.length];
for (i = 0; i < seq.length; i++) {//复制data到array,这样可以不破坏原始数据
array[i] = seq.data[i];
}
int start = 0;//start为每次报数的起始点
for (i = seq.length; i >= 2; i--) {
start = (start + m - 1) % i;//采用取模运算使报数从表尾回到表头
cout << array[start] << " ";
for (int j = start + 1; j < i; j++) {
array[j - 1] = array[j];
}
}
cout << array[0] << endl;
delete[] array;
}
template<class DataType>
void SequentialList<DataType>::Insert(int i, DataType x)
{
if ((length + 1 > MAXSIZE) || i<1 || i>length+1) {
cout << "insert error!"<<endl;
return;
}
for (int j = length; j >= i; j--) {
data[j] = data[j - 1];
}
data[i - 1] = x;
length++;
}
template<class DataType>
void SequentialList<DataType>::InsertAtHead(DataType x)
{
if (length + 1 > MAXSIZE){
cout << "insert error!" << endl;
return;
}
for (int j = length; j > 0; j--) {
data[j] = data[j - 1];
}
data[0] = x;
length++;
}
template<class DataType>
void SequentialList<DataType>::InsertAtTail(DataType x)
{
if (length + 1 > MAXSIZE) {
cout << "insert error!" << endl;
return;
}
data[length] = x;
length++;
}
template<class DataType>
void SequentialList<DataType>::SetValueAtLocation_iBy_x(int i, DataType x)
{
if (i<1 || i>length) {
cout << "set value error!" << endl;
return;
}
data[i - 1] = x;
}
template<class DataType>
void SequentialList<DataType>::PrintSequentialList()
{
if (length == 0) {
cout << "print error!" << endl;
return;
}
for (int i = 0; i < length; i++) {
cout << data[i]<<" ";
}
cout << endl;
}
template<class DataType>
void SequentialList<DataType>::ClearSequentialList()
{
length = 0;
}
template<class DataType>
void SequentialList<DataType>::ReverseSequentialList()
{
if (length == 0) {
cout << "reverse error!" << endl;
return;
}
DataType temp;
for (int i = 0; i < length/2; i++) {
temp = data[i];
data[i] = data[length - i - 1];
data[length - i - 1] = temp;
}
}
template<class DataType>
void SequentialList<DataType>::LeftRotate_kBit_I(int k)
{
if (length == 0) {
cout << "LeftRotate error!" << endl;
return;
}
DataType temp;
for (int i = 0; i < k; i++) {
temp = data[0];
for (int j = 0; j < length - 1; j++) {
data[j] = data[j + 1];
}
data[length - 1] = temp;
}
}
template<class DataType>
void SequentialList<DataType>::SegmentationReverseSequentialList(int from, int to)
{
if (length == 0 || from<0 || to>length-1) {
cout << "LeftRotate error!" << endl;
return;
}
DataType temp;
for (int i = 0; i <= (to - from) / 2; i++) {
temp = data[from + i];
data[from + i] = data[to - i];
data[to - i] = temp;
}
}
template<class DataType>
void SequentialList<DataType>::LeftRotate_kBit_II(int k)
{
if (length == 0) {
cout << "reverse error!" << endl;
return;
}
SegmentationReverseSequentialList(0, k - 1);//前(0-k)个元素倒置
SegmentationReverseSequentialList(k, length - 1);//后(n-k)个元素倒置
SegmentationReverseSequentialList(0, length - 1);//(0-n)个元素全部倒置
}
template<class DataType>
void SequentialList<DataType>::MergeIncrementally(SequentialList<DataType> A, SequentialList<DataType> B, SequentialList<DataType>& C)
{
int i = 0;
int j = 0;
int k = 0;
int tempA, tempB;
A.SequentialListByInsertSort();
B.SequentialListByInsertSort();
while (i < A.length && j < B.length) {
tempA = A.GetValueByLocation(i + 1);
tempB = B.GetValueByLocation(j + 1);
if (tempA == tempB) {
C.data[k++] = tempA;
i++;
j++;
}
else if (tempA < tempB) {
C.data[k++] = tempA;
i++;
}
else {
C.data[k++] = tempB;
j++;
}
}
while (i < A.length) {
tempA = A.GetValueByLocation(i + 1);
C.data[k++] = tempA;
i++;
}
while (j < B.length) {
tempB = B.GetValueByLocation(j + 1);
C.data[k++] = tempB;
j++;
}
C.SetLength(k);
}
template<class DataType>
void SequentialList<DataType>::SequentialListByInsertSort()
{
if (length == 0) {
cout << "reverse error!" << endl;
return;
}
//选用插入排序
DataType temp;
for (int i = 1; i < length; i++) {
for (int j = i; j > 0 && data[j] < data[j - 1]; j--) {
temp = data[j];
data[j] = data[j - 1];
data[j - 1] = temp;
}
}
}
SequentialListtTest.cpp
#include"SequentialList.cpp"
void main()
{
int a[17] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 };
SequentialList<int> Test1(a, 17);
cout << " 打印线性表:";
Test1.PrintSequentialList();
cout << " 获得线性表的长度:" << Test1.GetLength() << endl;
cout << "获得值为5的元素的位置:" << Test1.GetLocationByValue(5) << endl;
cout << " 删除位置为10的元素:" << Test1.DeleteByLocation(10) << endl;
cout << " 删除头部元素:" << Test1.DeleteAtHead() << endl;
cout << " 删除尾部元素:" << Test1.DeleteAtTail() << endl;
cout << " 打印线性表:";
Test1.PrintSequentialList();
cout << " 获得线性表的长度:" << Test1.GetLength() << endl;
cout << " 位置为4的元素的值:" << Test1.GetValueByLocation(4) << endl;
cout << " 在位置7插入元素33: " << endl;
Test1.Insert(7, 33);
cout << " 在头部插入元素23: " << endl;
Test1.InsertAtHead(23);
cout << " 在尾部插入元素43: " << endl;
Test1.InsertAtTail(43);
cout << " 打印线性表:";
Test1.PrintSequentialList();
cout << " 获得线性表的长度:" << Test1.GetLength() << endl;
cout << " 置位置6的元素的值为7:" << endl;
Test1.SetValueAtLocation_iBy_x(6,7);
cout << " 打印线性表:";
Test1.PrintSequentialList();
cout << " 获得线性表的长度:" << Test1.GetLength() << endl;
cout << " 倒置【反转】线性表:" << endl;
Test1.ReverseSequentialList();
cout << " 打印线性表:";
Test1.PrintSequentialList();
cout << " 获得线性表的长度:" << Test1.GetLength() << endl;
cout << " 方法一循环左移4位:" << endl;
Test1.LeftRotate_kBit_I(4);
cout << " 打印线性表:";
Test1.PrintSequentialList();
cout << " 获得线性表的长度:" << Test1.GetLength() << endl;
cout << " 方法二循环左移4位:" << endl;
Test1.LeftRotate_kBit_II(4);
cout << " 打印线性表:";
Test1.PrintSequentialList();
cout << " 获得线性表的长度:" << Test1.GetLength() << endl;
cout << " 获得线性表的最大值:" << Test1.GetMaxElement() << endl;
cout << " 获得线性表的最小值:" << Test1.GetMinElement() << endl;
cout << " 线性表从小到大排序:" << endl;
Test1.SequentialListByInsertSort();
cout << " 打印线性表:";
Test1.PrintSequentialList();
cout << " 获得线性表的长度:" << Test1.GetLength() << endl;
cout << " 判断线性表是否为空:" << Test1.IsEmpty() << endl;
cout << " 清空线性表:" << endl;
Test1.ClearSequentialList();
cout << " 判断线性表是否为空:" << Test1.IsEmpty() << endl;
cout << " 打印线性表:";
Test1.PrintSequentialList();
cout << " 获得线性表的长度:" << Test1.GetLength() << endl;
}