c++資料結構:線性表的儲存結構——順序表
阿新 • • 發佈:2019-01-29
順序表,表示線性表的儲存結構為順序儲存,其在使用時會向記憶體中申請一段連續的儲存單元,用單元的下標作為標記位置。其中,資料的型別由於不確定帶來一定的資料型別定義需求,所以我們採用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)
關於順序表暫時寫這麼多,有錯誤歡迎指正(及時改正),日後有則補充。