順序表,表示線性表的存儲結構爲順序存儲,其在使用時會向內存中申請一段連續的存儲單元,用單元的下標作爲標記位置。其中,數據的類型由於不確定帶來一定的數據類型定義需求,所以我們採用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)
關於順序表暫時寫這麼多,有錯誤歡迎指正(及時改正),日後有則補充。