线性表--顺序表

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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值