1. 程式人生 > 其它 >基本資料結構實現--順序表

基本資料結構實現--順序表

順序表是線性表的實現方式之一,其特點是邏輯上相鄰的元素在物理上也相鄰。順序表一般使用陣列實現。因此順序表可以隨機訪問,時

間複雜度為O(1)。但插入和刪除元素時,由於線性表的有序性,要移動大量元素,時間複雜度為O(n).

本程式碼擬使用動態分配空間的方式儲存順序表元素。

一個順序表結構型別如下:

1 struct SqList {
2     Elem* data;
3     int length;
4     int MaxSize;
5 };

其中length標記表中目前的元素個數;MaxSize標記這個順序表可容納的最大元素個數,data為順序表首元素的地址。順序表中第i個元素

為data[i-1]. 可以使用如下程式碼初始化一個順序表:

1 SqList L;
2 L.data = new ElemType;
3 L.length = 0;
4 L.MaxSize = MaxSize;    //MaxSize可以指定
 1 /*      順序表
 2     實現操作:
 3      *1 按位插入
 4      *2 按位刪除
 5      *3 按值查詢
 6      *4 增加表長
 7                 */
 8 #include <iostream>
 9 #include <cstdio>
10 using namespace std;
11 
12 typedef int
Elem; 13 14 struct SqList { 15 Elem* data; 16 int length; 17 int MaxSize; 18 }; 19 20 //初始化傳入的SqList 型別的變數L 21 bool InitList(SqList& L,int MaxSize) 22 { 23 L.data = new ElemType; 24 L.length = 0; 25 L.MaxSize = MaxSize; 26 return true; 27 } 28 29 //按位插入:在位序i插入元素e 插入後元素e的位序為i
30 bool InsertList( SqList &L, int i,Elem e ) 31 { 32 if( i < 1 || i > L.length + 1 ) 33 return false; 34 if( L.length >= L.MaxSize ) 35 return false; 36 for( int j=L.length; j>=i; j-- ) { 37 L.data[j] = L.data[j-1]; 38 } 39 L.data[i-1] = e; 40 L.length++; 41 return true; 42 } 43 44 //按位刪除:刪除位序為i的元素並用e將其值帶回 45 bool deleteList( SqList& L, int i, Elem& e ) 46 { 47 if( i < 1 || i > L.length ) 48 return false; 49 e = L.data[i-1]; 50 for( int j=i; j<L.length; j++ ) { 51 L.data[j-1] = L.data[j]; 52 } 53 L.length--; 54 return true; 55 } 56 57 //按值查詢:返回表中第一個等於e的元素的位序 58 int locateElem( SqList& L, Elem e ) 59 { 60 for( int i=0; i<L.length; i++ ) { 61 if( L.data[i] == e ) { 62 return i+1; 63 } 64 } 65 return -1; 66 } 67 68 //增加長度:將順序表的最大長度增加len 69 void increaseSize( SqList& L,int len ) 70 { 71 Elem* p = L.data; 72 Elem* np = new Elem[L.length+len]; 73 for( int i=0; i<L.length; i++ ) { 74 np[i] = p[i]; 75 } 76 L.MaxSize += len; 77 delete p; 78 } 79 80 int main() 81 { 82 SqList L; 83 InitList(L,100); 84 for( int i=1; i<100; i++ ) { 85 InsertList(L,i,i); 86 } 87 return 0; 88 }