/*
********功能:顺序表的基本操作
********日期:2015年3月17日
********作者:Cary Chen
********单位:CCUT
*/
#include<iostream>
using namespace std;
/**********************顺序表类的定义***************************/
template<class T>
class SqList{
private:
T* elem; //表首址
int length; //表长
int listsize; //表容量
public:
SqList(int m); //构造函数,创建容量为m的空表
~SqList(); //析构函数,删除表空间
void CreateList(int n); //创建具有n个元素的线性表
void Insert(int i,T e); //在表中第i个位置插入元素
T Delete(int i); //删除表中的第i个元素
T GetElem(int i); //获取第i个元素的值
int Locate(T e); //元素定位
void Clear(); //清空表
int Empty(); //判表空
int Full(); //判表满
int Length(); //测表长
void ListDisp(); //输出表元素
};
/**********************顺序表类的实现***************************/
template<class T>
SqList<T>::SqList(int m){ //构造函数,创建一个表容量为m的空表
elem=new T[m]; //申请表空间
length=0; //空表,表长为0
listsize=m; //表容量为m
}
template<class T>
SqList<T>::~SqList(){ //析构函数
delete [] elem; //释放表空间
length=0; //将表长设为0
listsize=0; //将表容量设为0
}
template<class T>
void SqList<T>::CreateList(int n){ //创建表长度为n的顺序表
if(n>listsize)
throw"参数非法";
cout<<"请依次输入"<<n<<"个元素值:"<<endl;
for(int i=0;i<n;i++)
cin>>elem[i];
length=n;
}
template<class T>
void SqList<T>::Insert(int i,T e){ //在表的第i个位置插入元素e,如不能插入,显示异常信息
if(length>=listsize)
throw"上溢";
if(i<1 || i>length+1)
throw"插入位置异常";
for(int j=length;j>=i;j--)
elem[j]=elem[j-1];
elem[i-1]=e;
length++;
}
template<class T>
T SqList<T>::Delete(int i){ //删除元素
T x;
if(length==0)
throw"下溢";
if(i<1||i>length+1)
throw"删除位置异常";
x=elem[i-1];
for(int j=i;j<=length;j++){
elem[j-1]=elem[j];
}
length--;
return x;
}
template<class T>
T SqList<T>::GetElem(int i){ //获取第i个元素的值
T e;
if(i<1 || i>length)
throw"位置不合法";
e=elem[i-1];
return e;
}
template<class T>
int SqList<T>::Locate(T e){ //元素定位。若找到,则返回该元素在表中的位序;若未找到,则返回0;
for(int i=0;i<length;i++)
if(e==elem[i]) //找到
return i+1; //返回元素在表中的序位
return 0; //未找到
}
template<class T>
void SqList<T>::Clear(){ //清空表
length=0;
}
template<class T>
int SqList<T>::Empty(){ //判表空
if(length==0)
return 1; //表空,返回1
else
return 0; //表不空,返回0
}
template<class T>
int SqList<T>::Full(){ //判表满
if(length==listsize)
return 1; //表满,返回1
else
return 0; //表不满,返回0
}
template<class T>
int SqList<T>::Length(){ //返回表长
return length;
}
template<class T>
void SqList<T>::ListDisp(){ //遍历输出表
for(int i=0;i<length;i++){
cout<<i+1<<": ";
cout<<elem[i]<<endl;
}
}
void menu(){
cout<<" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"<<endl;
cout<<" ^^^^^^^^^^^^^^^^^顺序表的基本操作^^^^^^^^^^^^^^^^^"<<endl;
cout<<" ^^^^^^^^^^^^^^^^^^^^请选择操作^^^^^^^^^^^^^^^^^^^^"<<endl;
cout<<" ***1、创建顺序表******************2、打印顺序表***"<<endl;
cout<<" ***3、插入数据 ******************4、删除元素 ***"<<endl;
cout<<" ***5、返回元素 ******************6、元素定位 ***"<<endl;
cout<<" ***7、清空表 ******************8、测表空 ***"<<endl;
cout<<" ***9、判表满 ******************10、测表长 ***"<<endl;
cout<<" ***11、退出 **********************************"<<endl;
cout<<" **************************************************"<<endl;
}
int main(){
int i;
int e;
SqList<int>L(20); //建立容量为20、元素类型为整数的空顺序表
int choice;
do{
cout<<endl;
menu();
cin>>choice;
switch(choice){
case 1: //创建表
cout<<"1-创建顺序表:"<<endl;
cout<<"请输入要创建的顺序表中元素的个数:"<<endl;
cin>>i;
try{
L.CreateList(i);
}
catch(char* err){
cout<<err<<endl;
}
cout<<"操作成功"<<endl;
break;
case 2: //打印表
cout<<"2-显示顺序表:"<<endl;
if(L.Length()==0)
cout<<"表已空,表中无数据!"<<endl;
else
L.ListDisp();
break;
case 3: //插入元素
cout<<"3-插入元素:"<<endl;
cout<<"请输入插入的位置:"<<endl;
cin>>i;
cout<<"请输入插入元素的值:"<<endl;
cin>>e;
try{
L.Insert(i,e);
cout<<"操作成功"<<endl;
}
catch(char* err){
cout<<err<<endl;
}
break;
case 4: //删除元素
cout<<"4-删除元素:"<<endl;
cout<<"请输入要删除的元素的位置"<<endl;
cin>>i;
try{
e=L.Delete(i);
cout<<"被删除的元素为:"<<e<<"……删除成功!"<<endl;
}
catch(char* err){
cout<<err<<endl;
}
break;
case 5: //查询第i个元素的值
cout<<"5-返回元素:"<<endl;
cout<<"请输入要查询的元素的位置:"<<endl;
cin>>i;
try{
e=L.GetElem(i);
cout<<"第"<<i<<"个元素为:"<<e<<endl;
}
catch(char* err){
cout<<err<<endl;
}
break;
case 6: //查询元素所在的位置
cout<<"6-元素定位:"<<endl;
cout<<"请输入要查询的元素值:"<<endl;
cin>>e;
i=L.Locate(e);
if(i!=0)
cout<<"查询元素"<<e<<"位于表中的位置为:"<<i<<endl;
else
cout<<"表中没有元素"<<e<<endl;
break;
case 7: //清空表
cout<<"7-清空表:"<<endl;
L.Clear();
cout<<"表已清空"<<endl;
break;
case 8: //判表空
cout<<"8-判表空:"<<endl;
i=L.Empty();
if(i)
cout<<"表空"<<endl;
else
cout<<"表不空"<<endl;
break;
case 9: //判表满
cout<<"9-判表满:"<<endl;
i=L.Full();
if(i)
cout<<"表满"<<endl;
else
cout<<"表不满"<<endl;
break;
case 10: //测表长
cout<<"10-测表长:"<<endl;
i=L.Length();
cout<<"表长为:"<<i<<endl;
break;
case 11: //退出
break;
}
}while(choice!=11);
return 0;
}