c++模擬實現順序表

gogogo_sky發表於2017-05-26

一、用物件導向的思想模擬實現動態順序表;
寫一個順序表類;該順序表類的成員變數為:_sz記錄順序表實際儲存的元素個數;_capacity記錄順序表的實際儲存容量;_data為一個動態陣列;儲存元素;
二、該順序表類的成員函式有
(1)類的預設成員數;

SeqList()//構造
SeqList(const SeqList& seqlist)//拷貝構造
SeqList& operator=(SeqList seqlist)//賦值運算子過載
~SeqList()//解構函式

(2)對順序表元素的操作函式;

void PushBack(const DataType& x)//尾插
void PopBack()//尾刪
void PushFront(const DataType& x)//頭插
void PopFront()//頭刪
void Insert(int pos,const DataType& x)//某一位置之前插入某個元素
int Find(const DataType& x)//查詢某一元素---二分查詢,返回元素的位置
void Remove(const DataType& x)//刪除第一個出現的元素
void RemoveAll(const DataType& x)//刪除所有出現的元素
void Sort()//排序---冒泡--升序
void CheakCapacity()//檢查並調整容量

三、程式碼實現:


//模擬實現順序表
#include<iostream>
using namespace std;
typedef int DataType;
class SeqList
{
    friend ostream& operator<<(ostream& os,const SeqList& seqList);
public:
    SeqList()//構造
        :_capacity(0)
        ,_sz(0)
        ,_data(NULL)
    {
        cout<<"構造"<<endl;
    }
    SeqList(const SeqList& seqlist)//拷貝構造
        :_capacity(seqlist._capacity)
        ,_sz(seqlist._sz)
        ,_data(new DataType[sizeof(DataType)*seqlist._sz])
    {
        cout<<"拷貝構造"<<endl;
        memcpy(_data,seqlist._data,sizeof(DataType)*seqlist._sz);
    }
    SeqList& operator=(SeqList seqlist)//賦值運算子過載
    {
        cout<<"賦值運算子過載"<<endl;
        std::swap(_data,seqlist._data);
        _capacity=seqlist._capacity;
        _sz=seqlist._sz;
        return *this;
    }
    ~SeqList()//解構函式
    {
        cout<<"析構"<<endl;
        if (_data!=NULL)
        {
            delete[]  _data; 
        }
        _capacity=0;
        _sz=0;
    }
public:
    void PushBack(const DataType& x)//尾插
    {
        CheakCapacity();
        _data[_sz++]=x;
    }
    void PopBack()//尾刪
    {
        _sz--;
    }
    void PushFront(const DataType& x)//頭插
    {
         CheakCapacity();
         for (int i=_sz;i>=1;i--)
         {
             _data[i]=_data[i-1];
         }
         _data[0]=x;
         _sz++;
    }
    void PopFront()//頭刪
    {
        for (int i=0;i<_sz-1;i++)
        {
            _data[i]=_data[i+1];
        }
        _sz--;
    }
    void Insert(int pos,const DataType& x)//某一位置之前插入某個元素
    {
        CheakCapacity();
        if (pos<0||pos>_sz)
        {
            return ;
        }
        for (int i=_sz;i>pos;i--)
        {
            _data[i]=_data[i-1];
        }
        _data[pos]=x;
        _sz++;       
    }
    int Find(const DataType& x)//查詢某一元素---二分查詢,返回元素的位置
    {
        Sort();//二分查詢的前提是資料已經排序好
        int start=0;
        int end=_sz-1;
        int mid=0;
        while (start<end)
        {
            mid=(start+end)/2;
            if (x>_data[mid])
            {
                start=mid+1;
            }
            if (x<_data[mid])
            {
                end=mid-1;
            }
            if (x==_data[mid])
            {
                return mid;
            }
        }
        return -1;
    }
    void Remove(const DataType& x)//刪除第一個出現的元素
    {
        if (_data==NULL)
        {
            printf("seqlist empty!");
        }
        int pos=0;
        while(pos<_sz&&_data[pos++]!=x)//找元素
        {}
        pos-=1;//該元素的位置
        if (_data[pos]==x)
        {
            if (pos==_sz-1)//處理元素為最後一個
            {
                PopBack();
            }
            for(int i=pos;i<_sz-1;i++)
            {
                _data[i]=_data[i+1];
            }
            _sz--;
        }
    }
    void RemoveAll(const DataType& x)//刪除所有出現的元素
    {
    //(1),(5);(4);(3);(3);(2);(6);
        if (_data==NULL)
        {
            printf("seqlist empty!");
        }
        int pos=0;
        while (pos<_sz+1)
        {       
            while(pos<=_sz&&_data[pos++]!=x)//找元素
            {}
            pos-=1;//該元素的位置
            if (_data[pos]==x)
            {
                if (pos==_sz-1)//處理元素為最後一個
                {
                    PopBack();
                }
                for(int i=pos;i<_sz-1;i++)
                {
                    _data[i]=_data[i+1];
                }
                _sz--;
            }
            if (pos==_sz)
            {
                break;
            }
        }

    }
    void Sort()//排序---冒泡--升序
    {
        if (_data==NULL)
        {
            printf("seqlist empty!");
        }
        int mark=0;
        for(int i=0;i<_sz-1;i++)//比較趟數
        {
            for (int j=0;j<_sz-i-1;j++)
            {
                if (_data[j]>_data[j+1])
                {
                    mark=1;
                    DataType tmp=_data[j];
                    _data[j]=_data[j+1];
                    _data[j+1]=tmp;
                }
            }
            if (mark=0)
            {
                break;
            }
        }
    }
    void Printf()
    {
        cout<<_capacity<<","<<_sz<<endl;
    }
private:
    void CheakCapacity()//檢查並調整容量
    {
       if (_sz>=_capacity)             
       {
           _capacity+=5;
           DataType* tmp=new DataType[_capacity];
           memcpy(tmp,_data,sizeof(DataType)*_sz);
           delete[] _data;
           _data=tmp;
       }
    }
private:
    int _capacity;
    int _sz;
    DataType* _data;
};
ostream& operator<<(ostream& os,const SeqList& seqList)
{
    for (int i=0;i<seqList._sz;i++)
    {
        os<<seqList._data[i]<<" ";
    }
    return os;
}

void test()
{
    SeqList s;
    s.PushBack(1);
    s.PushBack(5);
    s.PushBack(4);
    s.PushBack(5);
    s.PushBack(2);
    s.PushBack(6);
    s.PushBack(3);
    s.PushBack(3);

    s.Printf();
    cout<<"s  "<<s<<endl;
    cout<<"-----"<<endl;

    SeqList s1(s);
    s1.Printf();
    cout<<"s1(s)"<<s1<<endl;
    cout<<"-----"<<endl;


    SeqList s2;
    s2=s;
    s2.Printf();
    cout<<"s2=s  "<<s2<<endl;
/*
    //s.PopBack();
    //s.PopBack();
    //cout<<"尾刪兩個元素:"<<s<<endl;
    //s.PushFront(7);
    //s.PushFront(8);
    //s.PushFront(9);
    //cout<<"頭插三個元素:"<<s<<endl;
    //s.PopFront();
    //s.PopFront();
    //cout<<"頭刪兩個元素:"<<s<<endl;

    //s.Insert(3,99);
    //cout<<"下標為3的位置插入99:"<<s<<endl;
    /*s.Sort();*/
    //cout<<s.Find(3)<<endl;
    //cout<<s.Find(99)<<endl;
     /*s.Remove(1);*/
      //s.RemoveAll(3);
      //cout<<s<<endl;
}
int main()
{   
    test();
    return 0;
}

接下來是用物件導向的思想實現用c++語言實現單連結串列

相關文章