编程菜鸟的日记-初学尝试编程-顺序表的类定义及其基本操作算法(创建表、元素插入、元素删除、顺序查找、测表空、求表长、输出等)

//顺序表类定义如下:

//顺序表包含的内容:表首地址(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

posted @ 2013-11-03 22:09  编程的爬行者  阅读(949)  评论(0编辑  收藏  举报