1. 程式人生 > >c++資料結構:線性表的儲存結構——順序表

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)
關於順序表暫時寫這麼多,有錯誤歡迎指正(及時改正),日後有則補充。