1. 程式人生 > 其它 >線性表之順序儲存結構

線性表之順序儲存結構

 1 --------------------------------
 2 ADT 線性表(List)
 3 Data
 4 Operation
 5     InitList(*L); 初始化操作,建立一個空的線性表L
 6     ListEmpty(L); 若線性表為空,返回true,否則返回false
 7     ClearList(*L); 將線性表清空
 8     GetElem(L, i, *e) 將線性表L中的第i個位置元素值返回給e
 9     LocateElem(L, e); 線上性表L中查詢與給定值e相等的元素,如果查詢成功,返回該元素在表中序號表示成功;否則,返回0表示失敗
10 ListInsert(*L, i, e); 線上性表L中的第i個位置插入新元素e 11 ListDelete(*L, i, *e); 刪除線性表L中第i個位置元素,並用e返回其值 12 ListLength(L); 返回線性表L的元素個數 13 endADT 14 -------------------------------- 15 // 將所有的線上性表Lb中但不在La中的資料元素插入到La中 16 void union(List *La, List Lb) { 17 int La_len, Lb_len, i; 18 ElemType e; // 宣告與La和Lb相同的資料元素e
19 La_len = ListLength(La); // 求線性表的長度 20 Lb_len = ListLength(Lb); 21 for (i = 1; i <= Lb_len; i++) { 22 GetElem(Lb, i, e); // 取Lb中第i個數據元素賦給e 23 if (!LocateElem(La, e, equal)) // *La中不存在和e相同資料元素 24 ListInsert(La, ++La_len, e); // 插入 25 } 26 } 27 -------------------------------- 28
順序儲存的結構程式碼 29 30 #define MAXSIZE 20 // 儲存空間初始分配量 31 typedef int ElemType; // ElemType型別根據實際情況而定,這裡假設為int* 32 typedef struct { 33 ElemType data[MAXSIZE]; // 陣列儲存資料結構,最大值為MAXSIZE 34 int length; // 線性表當前長度 35 }SqList; 36 -------------------------------- 37 獲得元素 GetElem 38 #define OK 1 39 #define ERROR 0 40 #define TRUE 1 41 #define FALSE 0 42 typedef int Status; 43 // Status是函式的型別,其值是函式結果狀態程式碼,如OK等 44 // 初始條件:順序線性表L已存在,1≤i≤ListLength(L) 45 // 操作結果:用e返回L中第i個數據元素的值 46 Status GetElem(SqList L, int i, ElemType *e) { 47 if (L.length == 0 || i < 1 || i > L.length) 48 return ERROR; 49 *e = L.data[i-1]; 50 } 51 -------------------------------- 52 插入元素 ListInsert 53 // 初始條件:順序線性表L已存在,1≤i≤ListLength(L) 54 // 操作結果:在L中第i個位置之前插入新的資料元素e,L的長度加1 55 Status ListInsert(SqList *L,int i, ElemType e) { 56 int k; 57 if (L->length == MAXSIZE) 58 return ERROR; 59 if (i < 1 || i > L->length+1) 60 return ERROR; 61 if (i <= L->length) { 62 for (k = L->length-1; k >= i-1; k--) 63 L->data[k+1] = L->data[k]; 64 } 65 L->data[i-1] = e; 66 L->length++; 67 return OK; 68 } 69 -------------------------------- 70 刪除元素 71 // 初始條件:順序線性表L已存在,1≤i≤ListLength(L) 72 // 操作結果:刪除L的第i個數據元素,並用e返回其值,L的長度減1 73 Status ListDelete(SqList *L, int i, ElemType *e) { 74 int k; 75 if (L->length == 0) // 線性表為空 76 return ERROR; 77 if (i < 1 || i > L->length) // 刪除位置不正確 78 return ERROR; 79 *e = L->data[i-1]; 80 if (i < L->length) { 81 for (k = i; k < L->length; k++) 82 L->data[k-1] = L->data[k]; 83 } 84 L->length--; 85 return OK; 86 } 87 -------------------------------- 88 線性表順序儲存結構的優缺點 89 優點: 90 0.無須為表示表中元素之外的邏輯關係而增加額外的儲存空間 91 1.可以快速地存取表中任一位置的元素 92 缺點: 93 0.插入和刪除操作需要移動大量元素 94 1.當線性表長度變化較大時,難以確定儲存空間的容量 95 2.造成儲存空間的“碎片”