///////////////////////////////////
//日期:2014-09-30
//作者:Davis
//功能:顺序表类的实现
// #include "SqList.h"
//////////////////////////////////
template<class T>
class SqList
{
private:
T* elem; //表首址
int length; //表长
int listsize; //表容量
public:
//构造函数,创建容量为m的空表
SqList(int m)
{
elem = new T[m]; //申请表空间
length = 0; //空表,表长为0
listsize = m; //表容量为m
}
//析构函数,删除表空间
~SqList()
{
delete [] elem; //释放表空间
length = 0;
listsize = 0;
}
//创建具有n个元素的线性表
void CreateList(int n)
{
if(n>listsize) throw"参数非法";
cout<<"请依次输入"<<n<<"个元素值:"<<endl;
for(int i =1;i<=n;i++)
cin>>elem[i-i];
length = n;
}
//在表中第i个位置插入元素
void Insert(int i,T e)
{ //在第i个位置插入元素,如果不能插入,显示异常信息
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++;
}
//删除表中的第i个元素
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;
}
//获取第i个元素的值
T GetElem(int i)
{
T e;
if(i<1||i>length)throw"位置不合法";
e = elem[i-1];
return e;
}
//元素定位
int Locate(T e)
{
for(int i = 0;i<length;i++)
if(elemi[i] == e)
return i+1; //找到,返回该元素在表中的位序
return 0; //未找到,返回0
}
//清空表
void Clear()
{
length =0;
}
//测表是否空
int Empty()
{
if(length == 0)//判断表,若空,返回1.
return 1;
else //不空,返回0
return 0;
}
//测表是否满
int Full()
{
if(length == listsize) //表满,返回1
return 1;
else //不满,返回0
return 0;
}
//返回表长
int Length()
{
return length;
}
//输出表元素
void ListDisp()
{
for(int i = 0;i<length;i++)
{
cout<<i+1<<" ";
cout<<elem[i]<<endl;
}
}
}
/////////////////////////////////////////////////
// 顺序链表的测试
/////////////////////////////////////////////////
// SqList_main.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "SqList.h"
#include "process.h"
#include<iostream>
using namespace std;
char pause;
typedef int T; //T表示int类型
int _tmain(int argc, _TCHAR* argv[])
{
int i;
T e;
SqList<int>L(20); //建立容量为20、元素类型为整形的空顺序表
system("cls"); //执行系统命令,清屏
int choice;
do
{
cout<<"1-创建顺序表
";
cout<<"2-在链表第i个位置插入元素
";
cout<<"3-删除顺序表中第i个位置的元素
";
cout<<"4-返回第i个元素的值
";
cout<<"5-元素定位
";
cout<<"6-清空表
";
cout<<"7-测表空
";
cout<<"8-测表满
";
cout<<"9-测表长
";
cout<<"10-显示表长
";
cout<<"11-退出
";
cout<<"Enter choice:";
cin>>choice;
switch(choice)
{
case 1://创建表
cout<<"请输入要创建的顺序表中元素的个数:";
cin>>i;
cout<<endl;
try
{
L.CreateList(i);
}
catch(char* err)
{
cout<<err<<endl;
}
break;
case 2://元素插入
cout<<"请输入插入的位置";
cin>>i;
cout<<endl;
cout<<"请输入插入元素的值:";
cin>>e;
cout<<endl;
try
{
L.Insert(i,e);
}
catch(char* err)
{
cout<<err<<endl;
}
break;
case 3://元素删除
cout<<"请输入删除位置";
cin>>i;
cout<<endl;
try
{
e = L.Delete(i);
cout<<"被删除元素为:"<<e<<endl;
}
catch(char* err)
{
cout<<err<<endl;
}
cin.get(pause);
system("pause");
break;
case 4://返回第i个元素值
cout<<"请输入要查询的元素位置:";
cin>>i;
try
{
e = L.GetElem(i);
cout<<"第"<<i<<"个元素值为:"<<e<<endl;
}
catch(char* err)
{
cout<<err<<endl;
}
cin.get(pause);
system("pause");
break;
case 5://按值进行元素查询
cout<<"请输入要查询的元素值:";
cin>>e;
i = L.Locate(e);
cout<<"查询元素"<<e<<"在表中的位置为:"<<i<<endl;
cin.get(pause);
system("pause");
break;
case 6://清空表
L.Clear();
cout<<"表以清空"<<endl;
cin.get(pause);
system("pause");
break;
case 7://测表空
i = L.Empty();
if(i)
{
cout<<"表空"<<endl;
}
else
{
cout<<"表不空"<<endl;
}
cin.get(pause);
system("pause");
break;
case 8://测表满
i = L.Full();
if(i)
{
cout<<"表满"<<endl;
}
else
{
cout<<"表未满"<<endl;
}
cin.get(pause);
system("pause");
break;
case 9://测表长
i = L.Length();
cout<<"表长为:"<<endl;
cin.get(pause);
system("pause");
break;
case 10://遍历输出表
L.ListDisp();
cout<<endl;
cin.get(pause);
system("pause");
break;
case 11://退出
break;
default://非法选择
cout<<"Invalid choice";
break;
}
}while(choice != 11);
return 0;
}// end of main function