數據結構複習 線性表的順序存儲結構及其實現

由於線性表的數據元素類型不確定,所以採用C++的模板機制。

在寫模板時,由於長時間未寫過C++了,對其模板機制的概念非常模糊,如以下代碼存在基礎語法錯誤或者醜陋的代碼,請指出來,我將虛心改錯,感謝。

順序表——線性表的順序存儲結構

一、順序表的定義

順序表是用一段地址連續的存儲單元依次存儲線性表的數據元素。

二、順序表的存儲

通常用一維數組來實現順序表,使用時要注意區分數組的下標與線性表中元素的位置。

const int maxSize = 100;
template <class T>
class SeqList
{
public:
    SeqList()
    {
        length = 0;             //建立一個空的順序表
    }
    SeqList(T a[], int n);      //建立一個長度爲n的順序表
    ~SeqList() {}
    int Length()
    {
        return length;
    }
    T Get(int i);                 //按位查找
    int Locate(int x);              //按值查找
    void Insert(int i, T x);      //插入操作
    T Delete(int i);              //刪除線性表中的第i個元素
    void PrintList();               //遍歷操作
private:
    T data[maxSize];              //存放數組元素的值
    int length;                     //線性表的長度
};

1.構造函數

①無參構造函數(將順序表的長度length初始化爲0)

SeqList()
    {
        length = 0;             //建立一個空的順序表
    }

②有參構造函數

template<class T>
SeqList<T>::SeqList(T a[], int n)
{
    if( n > maxSize)
        throw "參數非法";
    for(int i = 0; i < n; i++)
        data[i] = a[i];
    length = n;
}

2.按位查找算法 Get

template<class T>
T SeqList<T>::Get(int i)
{
    if(1 > i || length < i)
        throw "查找位置非法";
    return data[i - 1];
}

3.按值查找算法 Locate

template<class T>
int SeqList<T>::Locate(int x)
{
    for(int i = 0; i < length; i++)
    {
        if(data[i] == x)
            return i + 1;
    }
    return 0;
}

4.插入算法

template<class T>
void SeqList<T>::Insert(int i, T x)
{
    if(length >= maxSize)
        throw "上溢";
    if(i < 1 || i > length + 1)
        throw "位置異常";
    for(int j = length; j >= i; j--)
    {
        data[j] = data[j - 1];      //注意第j個元素存在數組下標爲j-1處
    }
    data[i - 1] = x;
    length++;                   //表長加一
}

5.刪除算法

template<class T>
T SeqList<T>::Delete(int i)
{
    if(length == 0)
        throw "下溢";
    if(i < 1 || i > length)
        throw "位置異常";
    T x = data[i - 1];                //取出位置i的元素
    for(int j = i; j < length; j++)
    {
        data[j - 1] = data[j];      //將下標爲i,i+1,... 處的元素分別移動到下標i-1,i,...處
    }
    length--;
    return x;
}

6.遍歷

template<class T>
void SeqList<T>::PrintList()
{
    for(int i = 0; i < length; i++)
        cout << data[i] << " ";
    cout << endl;
}

7.主函數

int main()
{
    int a[maxSize], i, SearchPos, NewPos, NewItem, DelPos ;
    int n = 0;

    //創建順序表
    cout << "請輸入順序表長度:" ;
    cin >> n ;    //輸入樣本數目(表長)
    cout << "請輸入表中所有元素:";
    for (i = 0 ; i < n; i++)
    {
        cin >> a[i] ;
    }
    SeqList<int> seqList(a, n);

    cout << "該順序表爲:";
    seqList.PrintList();   //顯示順序表
    cout << "請輸入所查找的元素的位置:" ;
    cin >> SearchPos ;    //輸入查找位置
    cout << "該位置的元素爲:" << seqList.Get(SearchPos) << endl ;   //輸出查找的數據元素值

    cout << "請輸入所插入元素的值:" ;
    cin >> NewPos ;        //插入位置輸入
    cout << "請輸入所插入的元素的位置:" ;
    cin >> NewItem ;    //插入元素輸入
    seqList.Insert(NewItem, NewPos) ;     //新數據插入順序表中

    cout << "插入後的順序表爲:" ;
    seqList.PrintList();        //插入數據後,輸出新的順序表

    cout << "請輸入所刪除元素的位置:" ;
    cin >> DelPos ;        //輸入刪除元素位置
    seqList.Delete(DelPos) ;    //按位置刪除數據

    cout << "刪除後的順序表爲:" ;
    seqList.PrintList();
    return 0 ;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章