顺序表的实现

/*SeqList.h*/
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
const int DefaultSize=100;
#include<assert.h>
#include<conio.h>//程序中使用了getch函数,需要包含这个头文件
/*创建模板类,定义与实现必须放在同一个文件中*/

template<class T>
class CSeqList
{
public:
	CSeqList(int maxSize=DefaultSize);
	CSeqList(const CSeqList<T>& list);
	~CSeqList();
	 int Size()const;
	 int Length()const;
	 int Search(const T& x)const;
	 bool GetData(int i,T&x)const;//i为下标,从0开始,以下同
	 bool SetData(int i,const T&x);
	 bool Insert(int i,const T&x);//在第i个元素之前插入元素x
	 bool Append(int i,const T&x);//在第i个元素之后插入元素x
	 bool Append(const T&x);//在最后添加元素x
	 bool Remove(int i,T&x);
	 bool IsEmpty()const;
	 bool IsFull()const;
	 void clear(){last=-1;}
	 void Sort();
	 void Input();
	 void Output()const;
	 CSeqList<T>& operator=(const CSeqList<T>&list);
	 void trim();//相同元素只保留一个
private:
	void reSize();
	T* data;
	int maxSize;
	int last;
};


template<class T>
CSeqList<T>::CSeqList(int maxSize)
{
	assert(maxSize>0);
	this->maxSize=maxSize;
	last=-1;
	data=new T[maxSize];
	memset(data,0,sizeof(data));
}


template<class T>
CSeqList<T>::CSeqList(const CSeqList<T>& list)
{
	maxSize=list.Size();
	data=new T[maxSize];
	last=list.Length()-1;
	for(int i=0;i<=last;i++)
	{
		T x;
		list.GetData(i,x);
		data[i]=x;
	}
}

template<class T>
CSeqList<T>& CSeqList<T>::operator=(const CSeqList<T>& list)
{
	if(data!=NULL)delete[]data;
	maxSize=list.Size();
	data=new T[maxSize];
	last=list.Length()-1;
	for(int i=0;i<=last;i++)
	{
		T x;
		list.GetData(i,x);
		data[i]=x;
	}
	return *this;
}

template<class T>
CSeqList<T>::~CSeqList()
{
	if(data!=NULL)delete[]data;
}

template<class T>
int CSeqList<T>::Size()const
{
	return maxSize;
}

template<class T>
int CSeqList<T>::Length()const
{
	return last+1;
}

template<class T>
int CSeqList<T>::Search(const T& x)const
{
	for(int i=0;i<=last;i++)
		if(x==data[i])return i;
	return -1;
}

template<class T>
bool CSeqList<T>::GetData(int i,T&x)const
{
	if(i<0||i>last)return false;
	x=data[i];
	return true;
}

template<class T>
bool CSeqList<T>::SetData(int i,const T&x)
{
	if(i<0||i>last)return false;
	data[i]=x;
	return true;
}
template<class T>
bool CSeqList<T>::Insert(int i,const T&x)
{
	if(i<0||i>last)return false;
	if(IsFull())return false;
	for(int j=last;j>=i;j--)
		data[j+1]=data[j];
	data[i]=x;
	last++;
	return true;
}

template<class T>
bool CSeqList<T>::Append(int i,const T&x)
{
	if(i<0||i>last)return false;
	if(IsFull())return false;
	for(int j=last;j>=i+1;j--)
		data[j+1]=data[j];
	data[i+1]=x;
	last++;
	return true;
}



template<class T>
bool CSeqList<T>::Append(const T&x)
{
	if(IsFull())return false;
	data[++last]=x;
}

template<class T>
bool CSeqList<T>::Remove(int i,T&x)
{
	if(i<0||i>last)return false;
	x=data[i];
	for(int j=i+1;j<=last;j++)
		data[j-1]=data[j];
	last--;
	return true;
}

template<class T>
bool CSeqList<T>::IsEmpty()const
{
	return last==-1;
}

template<class T>
bool CSeqList<T>::IsFull()const
{
	return last+1==maxSize;
}

template<class T>
void CSeqList<T>::Sort()
{
	for(int i=0;i<last;i++)
	{
		int k=i;
		for(int j=i+1;j<last+1;j++)
			if(data[k]>data[j])k=j;
		if(k!=i){int tmp=data[k];data[k]=data[i];data[i]=tmp;}
	}
}

template<class T>
void CSeqList<T>::Input()
{
	cout<<"Enter your elements,\nusing CTRL+D to stop it."<<endl;
	T element;
	while(cin>>element)
	{
		if(IsFull())
		{
			cerr<<"SeqList Full!ReSize now?(Y/N)";
			char ch;
			ch=getch();//这里不能使用cin>>ch,cin缓冲区不空时,cin从cin缓冲区读取数据,而不从键盘读取数据
			putchar(ch);
			putchar('\n');
			if(ch=='N'||ch=='n')break;
			else
			{
					reSize();
			}
		}
		data[++last]=element;
	}
}


template<class T>
void CSeqList<T>::Output()const
{
	for(int i=0;i<=last;i++)
		cout<<data[i]<<" ";
	cout<<endl;
}

/*默认扩充为原来的两倍容量*/
template<class T>
void CSeqList<T>::reSize()
{
	T* newdata=new T[2*maxSize];
	for(int i=0;i<=last;i++)newdata[i]=data[i];
	delete[]data;
	data=newdata;
	maxSize*=2;
}

template<class T>
void CSeqList<T>::trim()
{
	CSeqList<T>result;
	for(int i=0;i<=last;i++)
		if(result.Search(data[i])==-1)result.Append(data[i]);
	*this=result;
}

#endif

/*main.cpp*/
#include<iostream>
#include"SeqList.h"
using namespace std;

/*求两集合的并,时间复杂度是O(m*n)*/
template<class T>
void unionSet(const CSeqList<T>&listA,const CSeqList<T>& listB)
{
	CSeqList<T>list(listA);
	int last=listA.Length()-1,len=listB.Length();
	T x;
	for(int i=0;i<len;i++)
	{
		listB.GetData(i,x);
		list.Append(x);
	}
	list.trim();//去除重复元素
	list.Output();
}

/*求两个集合的交,时间复杂度O(m*n)*/
template<class T>
void interSet(const CSeqList<T>&listA,const CSeqList<T>& listB)
{
	CSeqList<T>list;
	int last=listA.Length()-1;
	T x;
	for(int i=0;i<=last;i++)
	{
		listA.GetData(i,x);
		if(listB.Search(x)!=-1)list.Append(x);
	}
	list.trim();//去除重复元素
	list.Output();
}


void menu()
{
	cout<<"****************菜单*******************"<<endl;
	cout<<"0:输入元素"<<endl;
	cout<<"1:查看体积"<<endl;
	cout<<"2:查看实际大小"<<endl;
	cout<<"3:搜索元素"<<endl;
	cout<<"4:获取元素"<<endl;
	cout<<"5:修改元素"<<endl;
	cout<<"6:向前插入(Insert)元素"<<endl;
	cout<<"7:向后插入(Append)元素"<<endl;
	cout<<"8:删除元素"<<endl;
	cout<<"9:检查是否为空"<<endl;
	cout<<"10:检查是否为满"<<endl;
	cout<<"11:排序"<<endl;
	cout<<"12:打印所有元素"<<endl;
	cout<<"13:清屏"<<endl;
	cout<<"-1:退出"<<endl;
	cout<<"************************************"<<endl;
}
int main()
{
	CSeqList<int>listA,listB;
	listA.Input();
	cin.clear();
	cin.sync();
	listB.Input();
	unionSet(listA,listB);
	interSet(listA,listB);
	/*
	*被注释掉的部分用于对类中函数做测试
	menu();
	CSeqList<T>list;
	int ch;
	while(true)
	{
	
		cout<<"选择操作:";
		cin.clear();//设置cin状态
		cin.sync();//清空cin缓冲区
		cin>>ch;
		switch(ch)
		{
		case 0:
			list.Input();			
			break;
		case 1:
			cout<<list.Size()<<endl;
			break;
		case 2:
			cout<<list.Length()<<endl;
			break;
		case 3:
			{
				cout<<"输入待搜索元素:";
				int x;
				cin>>x;
				int index=list.Search(x);
				if(index==-1)cout<<x<<"不存在"<<endl;
				else cout<<index<<endl;
			}
			break;
		case 4:
			{
				cout<<"输入待获取元素的下标:";
				int index,x;
				cin>>index;
				if(list.GetData(index,x))cout<<"list["<<index<<"]="<<x<<endl;
				else cout<<"获取元素失败!"<<endl;

			}
			break;
		case 5:
			{
				cout<<"输入待修改元素的下标与新值:";
				int index,x;
				cin>>index>>x;
				if(list.SetData(index,x))cout<<"修改成功"<<endl;
				else cout<<"修改失败"<<endl;
			}
			break;
		case 6:
			{
				cout<<"输入插入位置与数值:";
				int index,x;
				cin>>index>>x;
				if(list.Insert(index,x))cout<<"插入成功"<<endl;
				else cout<<"插入失败"<<endl;
			}
			break;
		case 7:
			{
				cout<<"输入插入位置与数值:";
				int index,x;
				cin>>index>>x;
				if(list.Append(index,x))cout<<"插入成功"<<endl;
				else cout<<"插入失败"<<endl;
			}
			break;
		case 8:
			{
				cout<<"输入删除位置:";
				int index,x;
				cin>>index;
				if(list.Remove(index,x))cout<<"删除成功"<<endl;
				else cout<<"删除失败"<<endl;
			}
			break;
		case 9:
			cout<<(list.IsEmpty()?"空":"非空")<<endl;
			break;
		case 10:
			cout<<(list.IsFull()?"满":"不满")<<endl;
			break;
		case 11:
			list.Sort();
			cout<<"排序完成"<<endl;
			break;
		case 12:
			list.Output();
			break;
		case 13:
			system("cls");
			menu();
			break;
		case -1:
			goto Lable;
			break;
		default:
			cout<<"未知命令"<<endl;
			break;
		}
	}
	*/
	Lable:return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值