编程菜鸟的日记-初学尝试编程-顺序表的类定义及其基本操作算法(创建表、元素插入、元素删除、顺序查找、测表空、求表长、输出等)
//顺序表类定义如下:
//顺序表包含的内容:表首地址(elem)+表长(length)+表容量(listsize)
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个位置插入元素e
T Delete(int i); //删除T表中第i个元素
T GetElem(int i);//获得第i个元素的值
int Locate(T e);//定位值为e的元素在表中的位置
void Clear(); //清空表
int Empty(); //测表空
int Full(); //测表满
int Length(); //测表长
void ListDisp(); //输出表元素
};
//源程序
//创建头文件SqList.h
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;
listsize=0;
}
//void CreateList(int n); 创建具有n个元素的线性表
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) //加i是否合理的判断,超出表头和表尾
throw"插入位置异常";
for(int j=length-1;j>=i-1;j--)
elem[j+1]=elem[j];//将i-1到length-1的元素全部向后移动一个位置,移到i~length
elem[i-1]=e;//注意第i个位置是表中第i-1个元素
length++;//表长度加1
}
//T Delete(int i);获得第i个元素的值
template<class T>
T SqList<T>::Delete(int i)
{//删除表中第i个位置元素,如若不能删除,显示异常信息
T x;
if(length==0)
throw"下溢";
if(i<1||i>=length+1)
throw"删除位置异常";
x=elem[i-1];//获取第i个位置的元素
for(int j=i;j<=length-1;j++)//将i到length-1上的元素全部向前移动一个位置
elem[j-1]=elem[j];
length--;
return x;
}
//int Locate(T e);定位值为e的元素在表中的位置
template<class T>
int SqList<T>::Locate(T e)
{//找到表中等于e的值,返回e在表中位置;若没找到则返回0
for(int i=0;i<length-1;i++)
{
if(elem[i]==e)
return i+1;//找到,返回位置为i+1
}
return 0; //未找到,返回0
}
//void Clear(); 清空表
template<class T>
void SqList<T>::Clear()
{
length=0;//清空表
}
// int Empty(); 测表空
template<class T>
int SqList<T>::Empty()
{//表空返回0,否则返回0
if(length==0)
return 1;
else
return 0;
}
//T GetElem(int i);获得第i个元素的值
template<class T>
T SqList<T>::GetElem(int i)
{//判断i是否合理,若合理则返回第i个元素值,否则返回异常信息
if(i<1||i>=length-1)
throw"位置不合法";
else
{
T x;
x=elem[i-1];
return x;
}
}
//int Full(); 测表满
template<class T>
int SqList<T>::Full()
{//满则返回1;否则返回0
if(length==listsize)
return 1;//表满
else
return 0;
}
//int Length(); 测表长
template<class T>
int SqList<T>::Length()
{
return length;//返回表长
}
//void ListDisp(); 输出表元素
template<class T>
void SqList<T>::ListDisp()
{
for(int i=0;i<=length-1;i++)
cout<<i+1<<":"<<elem[i]<<endl;
}
//主函数调用
//SqList_main().cpp
#include <iostream>//cout,cin
#include "process.h"//exit()
using namespace std;
#include "SqList.h"//顺序表类定义,顺序类的实现
typedef int T;//自定义 T为int,在程序中所有T为int
//顺序表的基本操作算法,包括创建表、元素插入、元素删除、元素顺序查找、测表空、求表长等。
int main()
{
int i;
T e;
SqList<T> L(20);//建立容量为20,元素类型为整型的空顺序表
system("cls");//执行系统命令cls,清屏
int choice;
do
{//显示主要功能菜单
cout<<"1-创建顺序表\n";
cout<<"2-在链表第i个位置插入元素\n";
cout<<"3-删除顺序表中第i个位置的元素\n";
cout<<"4-返回第i个位置上的元素值\n";
cout<<"5-定位表中元素值为e的位置\n";
cout<<"6-清空表\n";
cout<<"7-测表空\n";
cout<<"8-测表满\n";
cout<<"9-测表长\n";
cout<<"10-输出表元素\n";
cout<<"11-退出\n";
cout<<"Enter choice:";
cin>>choice;
switch(choice)
{
case 1://创建表
cout<<"请输入要创建的顺序表中元素的个数:";
cin>>i;
cout<<endl;
L.CreateList(i);//创建表元素为i个的顺序表
break;
case 2://插入元素
cout<<"请输入要插入的位置:";
cin>>i;
cout<<endl;
cout<<"请输入要插入的值:";
cin>>e;
cout<<endl;
L.Insert(i,e);//将e插入i位置
break;
case 3://删除位置i的元素
cout<<"请输入要删除元素的位置:";
cin>>i;
cout<<endl;
e=L.Delete(i);
cout<<"被删除的元素为:"<<e<<endl;
system("pasue");
break;
case 4://返回位置i上的元素值
cout<<"请输入要查询的元素位置:";
cin>>i;
cout<<endl;
e=L.GetElem(i);
cout<<"第i个元素值为:"<<e<<endl;
system("pasue");
break;
case 5://定位表中元素值为e的位置
cout<<"请输入查询的元素值:";
cin>>e;
cout<<endl;
i=L.Locate(e);
cout<<"要查询的元素"<<e<<"位于表中位置为:"<<i<<endl;
system("pause");
break;
case 6://清空表
cout<<"清空表"<<endl;
L.Clear();
cout<<"表已清空"<<endl;
system("pause");
break;
case 7://测表空
i=L.Empty();
if(i)
cout<<"表空"<<endl;
else
cout<<"表不为空"<<endl;
system("pause");
break;
case 8://测表满
i=L.Full();
if(i)
cout<<"表满"<<endl;
else
cout<<"表不满"<<endl;
system("pause");
break;
case 9://测表长
i=L.Length();
cout<<"表长为:"<<i<<endl;
system("pause");
break;
case 10://输出表元素
L.ListDisp();
system("pause");
cout<<endl;
break;
case 11://退出
break;
default://非法选择
cout<<"非法选择\n";
break;
}
}while(choice!=11);
return 0;
}//end of main