顺序表----数组结构c++

来源:互联网 发布:手机免费阅读软件 编辑:程序博客网 时间:2024/05/17 08:37
#include <iostream>
using namespace std;
#define MaxSize 100
template <class T>
class SqListClass
{
    public:
        SqListClass();
        virtual ~SqListClass();
        void CreateList(T a[],int n);//有a数组中的元素建立顺序表
        void DispList();//输出顺序表L中的所有元素
        int ListLength();//求顺序表的长度
        bool GetElem(int i ,T& e);//求顺序表中某个序号的元素值

        int LocateElem(T e);//按元素查找了其序号
        bool ListInsert(int i, T e);//插入数据元素
        bool ListDelete(int i);//删除数据元素
        template <typename TT>
        friend void Reverse(SqListClass<TT>& L);//所有的元素逆置
        //对于含有n个元素的顺序表L,设计一个算法删除其中一个值为x的元素,分析算法的时间
//        复杂度O(n)和空间复杂度O(1)
        template <typename TT>
        friend bool Delaelem(SqListClass<TT>& L,TT x);

        //假设两个递增有序顺序表L1和L2,分别含有n个和m个元素,设计一个算法将
//        他们的所有元素归并为一个递增有序顺序表L3,称为有序表的二路归并,分析
//        算法的时间复杂度O(m+n)和空间复杂度O(1)。
        template <typename TT>
        friend void Merge2(SqListClass<TT>& L1,SqListClass<TT>& L2,SqListClass<TT>& L3);
    private:
        T * data;
        int length;
};
template <typename TT>
void Merge2(SqListClass<TT>& L1,SqListClass<TT>& L2,SqListClass<TT>& L3)
{
    int i=0,j=0,k=0;
    while(i<L1.length && j<L2.length)//两个表都没有遍历完
    {
        if(L1.data[i]<L2.data[j])
        L3.data[k++] = L1.data[i++];
        else
        L3.data[k++] = L2.data[j++];
    }
    while(i<L1.length)//L1没有遍历完
    {
        L3.data[k++] = L1.data[i++];
    }
    while(j< L2.length) L3.data[k++]=L2.data[j++];//L2没有遍历完
    L3.length=k;
}
template <typename TT>
bool Delaelem(SqListClass<TT> &L,TT x){
    int i =0 ;
    while(i<L.length&&L.data[i]!=x) i++;
    if(i>= L.length) return false;
    for(int j=i;j<L.length-1;j++)
    {
        L.data[j]=L.data[j+1];
    }
    L.length--;
    return true;
}
template <class T>
SqListClass<T>::SqListClass()
{
    data = new T[MaxSize];
    length = 0;
}
template <class T>
SqListClass<T>::~SqListClass()
{
    delete[] data;
    length = 0;
}
//完成了初始化
template <class T>
void SqListClass<T>::CreateList(T a[],int n)
{
    int i;
    for( i =0;i<n ;i++)
    {
        data[i]=a[i];
    }
    length = i;
}
template <class T>
void SqListClass<T>::DispList()
{
    int i;
    if(length>0)
    {
        for(i=0;i<length;i++)
        cout<<data[i]<<" ";
        cout<<endl;
    }
}
//取序号为i的元素
template <class T>
bool SqListClass<T>::GetElem(int i,T& e)
{
    if(i<1 || i>length) return false;
    e = data[i-1];
    return true;
}
//删除逻辑序号为i的元素
template <class T>
bool SqListClass<T>::ListDelete(int i)
{
    if(i<0||i>length) return false;
    for(int j=i;j<length;j++)
    data[j-1]=data[j];
    length--;
    return true;
}
template <class T>
bool SqListClass<T>::ListInsert(int i,T e)
{
    if(i<0||i>length) return false;
    for(int j=length;j>=i;j--)
    data[j]=data[j-1];
    data[i-1]=e;
    length++;
    return true;
}
template <class T>
int SqListClass<T>::ListLength()
{
    return length;
}
template <class T>
int SqListClass<T>::LocateElem(T e)
{
    int i =0;
    for( i=0;i<length;i++)
    {
        if(e == data[i])
        return i+1;
    }
    if(i>=length) return 0;
//    while(i<length && e!=data[i] ) i++;
//    if(i>=length) return 0;
//    else return i+1;
}
template <class TT>
void Reverse(SqListClass<TT> &L)
{
    TT temp;
    int i;
    for(i =0 ;i<L.length/2;i++)
    {
        temp = L.data[i];
        L.data[i]=L.data[L.length-i-1];
        L.data[L.length-i-1]= temp;
    }
}


int main()
{
    SqListClass<int> sql;
    int a[MaxSize];
    //初始化
    for(int i=0;i<MaxSize;i++)
    a[i]=i;
    sql.CreateList(a,10);
    sql.DispList();

    SqListClass<int> sql_two;
    sql_two.CreateList(a,20);
    cout<<"sql_two display:"<<endl;
    sql_two.DispList();

    SqListClass<int> sql_three;
    Merge2(sql,sql_two,sql_three);
    sql_three.DispList();
    int temp;
//    sql.GetElem(3,temp);
//    cout<<"sql.GetElem(3,temp):"<<temp<<endl;
//    sql.ListDelete(3);
//    cout<<" sql.ListDelete(3):"<<endl;
//    sql.DispList();
//
//    sql.ListInsert(5,temp);
//    sql.DispList();
//    cout<<"sql.LocateElem(5)"<<sql.LocateElem(5)<<endl;
//    sql.DispList();
//    Reverse(sql);//逆置
//    temp = 5;
//    Delaelem(sql,5);
//    sql.DispList();

//    cout << "Hello world!" << endl;
    return 0;
}
































0 0
原创粉丝点击