您的位置:首页 > 编程语言 > C语言/C++

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

2015-01-30 10:04 288 查看
#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: