今天總結一下數據結構中的線性表中的順序存儲結構,這是一種比較簡單的結構。
首先,看一下什麼是線性表。
什麼是線性表?
線性表是一種簡單的數據結構,數據元素之間是一對一的關係,即除了第一個和最後一個元素外其餘元素都是首尾相接的。元素的個數稱爲線性表的長度,長度爲零則表示線性表爲空。
什麼是線性表的順序存儲結構?
線性表中的順序存儲結構就是把線性表中的元素按邏輯次序依次存放在一組地址連續的存儲空間中,也把這種線性表稱爲順序表。根據順序表的特點,通常是用數組來存儲元素的。
下面就看具體的實現(C++)。
定義一個順序表的模板類,聲明相應的方法。
<span style="font-family:Courier New;font-size:14px;">const int MAXSIZE = 1000; //定義順序表的最大長度
template <class T> //定義模板類
class SeqList {
public:
SeqList() {
length = 0; //無參構造函數
}
//初始化一個含有n個元素的順序表
SeqList(const T a[],int n);
int GetLength() //獲取順序表的長度
return length;
}
void PrintList(); //打印出順序表中的元素值
void Insert(int i,T x); //將元素x插入到指定的位置
T Delete(int i); //刪除位置爲i的元素
T Get(int i); //返回位置爲i的元素的值
int Locate(T x); //查找順序表中值爲x的元素,返回其位置
private:
int length; //順序表長度
T data [MAXSIZE]; //存儲數據元素的數組
};</span>
有參數的構造方法的實現:一次將給定數組裏的元素賦值給data數組,若元素個數超過順序表長度,則拋出異常<span style="font-family:Courier New;font-size:14px;">template <class T>
SeqList<T>::SeqList(const T a[],int n) {
if(n>MAXSIZE)
throw "數組長度不能超過順序表的最大長度";
for(int i=0;i<n;i++) {
data[i] = a[i];
}
length = n;
}</span>
遍歷順序表中的元素,比較簡單,for循環,一次取出數組元素即可.
<span style="font-family:Courier New;font-size:14px;">template <class T>
void SeqList<T>::PrintList() {
cout<<"按順序依次遍歷順序表中的元素"<<endl;
for(int i=0;i<length;i++) {
cout<<data[i]<<" ";
}
cout<<endl;
}</span>
順序表的插入操作思路:
- 判斷此時順序表是否已滿,若滿,則拋出異常
- 判斷插入的位置是否合理,比如不能插在比順序表長度還大的位置
- 依次從最後一個元素開始到第i個元素,分別向後移一個位置,空出要插入的位置
- 將元素插入到指定位置
- 將循序表長度增1
<span style="font-family:Courier New;font-size:14px;">template <class T>
void SeqList<T>::Insert(int i,T x) {
if(length>MAXSIZE) throw "長度過大";
if(i<1||i>=length+1) throw "插入位置不存在";
//從後往前遍歷 將數組元素依次後移 直到等於i時
for(int j=length;j>=i;j--){
data[j] = data[j-1];
}
data[i-1] =x;
length++; //數組長度增1
}</span>
順序表的刪除操作思路:
- 如果表空,則拋出異常
- 如果刪除元素位置不存在,則拋出位置異常
- 取出要刪除的元素,保留下來(可以知道刪除的是哪個元素)
- 依次將第i+1個到n的元素,向前移動一個位置
- 順序表長度減1,返回刪除的元素
<span style="font-family:Courier New;font-size:14px;">template <class T>
T SeqList<T>::Delete(int i) {
T n = data[i-1]; //待刪元素
for(int j=i;j<length;j++) {
data[j-1] = data[j];
}
length--;
return n;
}</span>
獲取順序表中的元素以及位置:
<span style="font-family:Courier New;font-size:14px;">template <class T>
T SeqList<T>::Get(int i) {
return data[i-1];
}
template <class T>
int SeqList<T>::Locate(T x) {
for(int i=0;i<length;i++) {
if(data[i]==x) {
return i+1;
}
}
return 0;
}</span>
測試:
<span style="font-family:Courier New;font-size:14px;">int main()
{
int a[6]={11,21,22,43,23,14};
SeqList<int> list(a,6);
list.PrintList();
list.Insert(2,5);
list.PrintList();
int x = list.Delete(3);
cout<<"刪除元素爲:"<<x<<endl;
list.PrintList();
int i = list.Locate(22);
cout<<"22所在的位置爲:"<<i<<endl;
return 0;
}</span>
結果: