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