c++數據結構:線性表的存儲結構——順序表

順序表,表示線性表的存儲結構爲順序存儲,其在使用時會向內存中申請一段連續的存儲單元,用單元的下標作爲標記位置。其中,數據的類型由於不確定帶來一定的數據類型定義需求,所以我們採用c++的模板來實現。
類模板的定義及相關函數的實現:

#pragma once
#include<iostream>
using namespace std;

const int Maxsize = 100;       //定義順序表結構的長度

template<typename T>
class seqList
{
public:
    seqList();     //構造函數
    seqList(T a[],int n);     //構造函數
    ~seqList();    //析構函數
    int seqLength() { return length; }     //求當前數組的長度
    T seqGet(int n);     //按位查找,查找指定位置的元素
    int seqLocate(T value);   //按值查找,查找指定值的序號
    bool seqInsert(T value,int a);      //插入操作,在線性表中第i個位置插入值爲x的元素
    bool seqDelete(int a);      //刪除操作,刪除第i個元素
    void seqTraverse();    //遍歷操作
    bool seqEmpty();        //判空
    bool seqFull();      //判滿
    void  seqyuesefu( int m);   //約瑟夫問題
private:
    T iArray[Maxsize];      //待指定類型的長度固定的數組
    int length;                   //當前數組已存放元素的長度

};
template<typename T>
seqList<T>::seqList()         //無參的構造函數
{
    length = 0;
}
template<typename T>
seqList<T>::seqList(T a[], int n)     /*帶參的構造函數*/
{

    for (int i = 0; i < n; i++)
    {
        iArray[i] = a[i];
    }
    length = n;
}
template<typename T>      /*析構函數*/
seqList<T>::~seqList()
{

}
template<typename T>
T seqList<T>::seqGet(int n)    /*按位查找,接收位置變量a,返回該元素爲該下標的元素*/
{
    return iArray[n];
}
template<typename T>
int seqList<T>::seqLocate(T value)  /*按值查找,接收外部輸入的值a,然後遍歷該順序表,若找到某一個匹配的值,則返回該元素的位置,缺點:若該表中有多個匹配的值,則之後返回第一個匹配值的位置,日後有需要可進一步優化*/
{
    for (int i = 0; i < length; i++)
    {
        if (value == iArray[i])
        {
            return i+1;
        }
    }
    cout << "未找到所輸入的值" << endl;
}
template<typename T>
bool seqList<T>::seqInsert(T value, int a)    /*插入函數,接收外部變量(要插入的數的值,插入的位置),然後將要插入的位置以後的元素(包括該位置)向後移位,然後覆蓋該位置的元素(此時該位置的元素已經依次後移),長度加一*/
{
    if (seqFull())
    {
        return false;
    }
    if (a > Maxsize || a < 0)
    {
        return false;
    }
    for (int i =length; i > a-1; i--)
    {
        iArray[i] = iArray[i-1];
    }
    iArray[a-1] = value;
    length++;
    return true;
}
template<typename T>
bool seqList<T>::seqDelete(int a)     /*刪除函數,輸入某位置的元素,函數一次循環遍歷,並將該位置上的元素覆蓋,然後元素長度減一*/
{
    if (seqEmpty())
    {
        return false;
    }
    if (a>Maxsize||a<1)
    {
        return false;
    }
    for (int i = a-1; i < length; i++)
    {
        iArray[i] = iArray[i+1];
    }
    length--;
    return true;
}
template<typename T>
void seqList<T>::seqTraverse() /*遍歷函數,依次循環順序表中的元素,並將他們輸出*/
{
    for (int i = 0; i < length; i++)
    {
        cout << iArray[i] << ",";
    }
}
template<typename T>           //判空隊列,判斷當前隊列是否爲空隊列(沒有存儲元素)
bool seqList<T>::seqEmpty()
{
    return length == 0 ? true : false;
}
template<typename T>        //判滿隊列,判斷隊列中的元素個數是否已達最大值
bool seqList<T>::seqFull()
{
    return length == Maxsize ? true : false;
}
template<typename T>
void  seqList<T>::seqyuesefu(int m)       /*約瑟夫環問題,用順序表解決約瑟夫問題*/
{
    int out;
    int b = 0;
    cout << "原隊列的數組順序爲" << endl;
    seqTraverse();
    cout << "出隊順序爲:" << endl;
    while (length>0)
    {
        if (length < m)
        {
            out = m%length - b;
            while (out <= 0)
            {
                out += length;
            }
            cout << iArray[out - 1]<<",";
            b = length - out;
            seqDelete(out);
        }
        else if (length>=m)
        {
            if (b >= m)
            {
                out = length - b + m;
            }
            else if (b < m)
            {
                out = m-b;
            }
            cout << iArray[out - 1] << ",";
            b = length - out;
            seqDelete(out);
        }
    }
}

實例調用:

#include<iostream>
#include"seqList.h"
using namespace std;
int main()
{
    int a[5] = {1,2,3,4,5};
    seqList<int> iArra(a, 5);
    iArra.seqInsert(2, 4);                   //插入函數成功
    iArra.seqTraverse();                     //遍歷函數測試成功
    iArra.seqDelete(4);                      //刪除函數
    cout << endl;
    iArra.seqTraverse();                     
    cout<<endl<<iArra.seqLocate(4);               /*查找函數測試成功*/
    cout << endl << "當前長度爲:" << iArra.seqLength();       //返回長度函數調用成功
    iArra.seqyuesefu(100);
    return 0;
}

特點分析:按位查找時:時間複雜度是o(1);其餘查找,插入,刪除操作皆爲0(n)
注意點:表中元素的長度的元素位置和下標並不是相等的,在寫成員函數的時候需要特別注意,(第一位元素的下標爲0)
關於順序表暫時寫這麼多,有錯誤歡迎指正(及時改正),日後有則補充。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章