顺序表的基本操作(C++语言描述)

/*
********功能:顺序表的基本操作
********日期: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;
}

效果图:
这里写图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值