基本資料結構實現--順序表
阿新 • • 發佈:2021-06-25
順序表是線性表的實現方式之一,其特點是邏輯上相鄰的元素在物理上也相鄰。順序表一般使用陣列實現。因此順序表可以隨機訪問,時
間複雜度為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 intElem; 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的位序為i30 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 }