1. 程式人生 > >資料結構一——順序表

資料結構一——順序表

順序表基本運算的實現

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<algorithm>
  4 #define MaxSize 50
  5 using namespace std;
  6 
  7 typedef int ElemType;
  8 
  9 typedef struct
 10 {
 11     ElemType data[MaxSize];        //線性表中的元素
 12     int length;                    //線性表長度
13 }SqList; 14 15 //初始化線性表 16 //只需分配線性表的儲存空間,並將length設為0 17 void InitList(SqList * &L) 18 { 19 L = (SqList *)malloc(sizeof(SqList)); 20 L->length = 0; 21 } 22 23 //由a中的n個元素建立順序表 24 void CreatList(SqList * &L, ElemType a[], int n) 25 { 26 int k = 0; 27 L = (SqList *)malloc
(sizeof(SqList)); 28 for (int i = 0; i < n; i++) 29 L->data[i] = a[i]; 30 L->length = n; 31 } 32 33 //銷燬線性表 34 //就是釋放線性表L佔用的空間 35 void DestroyList(SqList * &L) 36 { 37 free(L); 38 } 39 40 //判斷線性表是否為空 41 bool ListEmpty(SqList * L) 42 { 43 return L->length == 0
; 44 } 45 46 //求線性表的長度 47 //順序表是O(1) 48 int ListLength(SqList * L) 49 { 50 return L->length; 51 } 52 53 //輸出線性表 54 void DispList(SqList * L) 55 { 56 for (int i = 0; i < L->length; i++) 57 printf("%d ", L->data[i]); 58 printf("\n"); 59 } 60 61 //求線性表中第i個元素值e 62 bool GetElem(SqList * L, int i, ElemType &e) 63 { 64 if (i < 1 || i > L->length) return false; //引數i錯誤時放回false 65 e = L->data[i]; 66 return true; 67 } 68 69 //按元素值查詢 70 //在順序表中查詢第一個值與e相等的元素的邏輯序號 71 int LocateElem(SqList * L, ElemType e) 72 { 73 bool pos = 0; //預設為0,表示沒找到 74 for (int i = 0; i < L->length; i++) 75 if (L->data[i] == e) 76 { 77 pos = i + 1; 78 break; 79 } 80 return pos; 81 } 82 83 //插入元素 84 //在順序表的第i個位置上插上新元素e 85 bool ListInsert(SqList * &L, int i, ElemType e) 86 { 87 if (i < 1 || i > L->length + 1) return false; 88 i--; 89 for (int j = L->length; j > i; j--) L->data[j] = L->data[j - 1]; //將data[i]及以後的元素後移一位 90 L->data[i] = e; 91 L->length++; 92 return true; 93 } 94 95 //刪除元素 96 bool ListDelete(SqList * &L, int i, ElemType &e) 97 { 98 if (i < 1 || i > L->length) return false; 99 i--; 100 e = L->data[i]; 101 for (int j = i; j < L->length; j++) L->data[j] = L->data[j + 1]; 102 L->length--; 103 return true; 104 } 105 106 //一些應用 107 //1、刪除順序表中所有值等於x的元素,要求時間複雜度為O(n)、空間複雜度為O(1) 108 void Delnode1(SqList * &L, ElemType x) 109 { 110 int cnt = 0; //記錄不等於x的元素的個數,即要插入到L中的元素的個數 111 for(int i = 0;i < L->length;i++) 112 if (L->data[i] != x) 113 L->data[cnt++] = L->data[i]; 114 L->length = cnt; 115 } 116 void Delnode2(SqList * &L, ElemType x) 117 { 118 int cnt = 0; //記錄等於x的元素的個數 119 for (int i = 0; i < L->length; i++) 120 { 121 if (L->data[i] == x) cnt++; 122 else L->data[i - cnt] = L->data[i]; 123 } 124 L->length -= cnt; 125 } 126 127 //2、儘可能設計一個高效的演算法,使得以第一個元素為分界線,將所有小於等於它的元素移到該基準前面,大於它的元素移到該基準的後面 128 //以下兩個都是時間複雜度為O(n)、空間複雜度為O(1) 129 void partition1(SqList * &L) 130 { 131 int i = 0, j = L->length - 1; 132 ElemType pivot = L->data[0]; 133 while (i < j) 134 { 135 while (i < j && L->data[j] > pivot) j--; //先要得到j,可考慮3、1、7、5、4 136 while (i < j && L->data[i] <= pivot) i++; //從左到右掃描,找到一個大於pivot的元素 137 if (i < j) swap(L->data[i], L->data[j]); 138 } 139 swap(L->data[0], L->data[i]); //最後將基準移到中間 140 } 141 void partition2(SqList * &L) 142 { 143 int i = 0, j = L->length - 1; 144 ElemType pivot = L->data[0]; 145 while (i < j) 146 { 147 while (i < j && L->data[j] > pivot) j--; 148 L->data[i] = L->data[j]; //利用第一位的空位 149 while (i < j && L->data[i] <= pivot) i++; 150 L->data[j] = L->data[i]; 151 } 152 L->data[i] = pivot; 153 } 154 155 //3、設計一個儘可能高效的演算法,將所有奇數移動到偶數的前面 156 //以下兩個都是時間複雜度為O(n)、空間複雜度為O(1) 157 void move1(SqList * &L) 158 { 159 int i = 0, j = L->length - 1; 160 while (i < j) 161 { 162 while (i < j && L->data[j] % 2 == 0) j--; //從右向左掃描,找到一個奇數 163 while (i < j && L->data[i] % 2 == 1) i++; //從左向右掃描,找到一個偶數 164 if (i < j) swap(L->data[i], L->data[j]); 165 } 166 } 167 void move2(SqList * &L) 168 { 169 int cnt = -1; //當前奇數的個數 170 for(int i = 0;i <= L->length;i++) 171 if (L->data[i] % 2 == 1) //i指向奇數時 172 { 173 cnt++; 174 if (cnt != i) swap(L->data[cnt], L->data[i]); 175 } 176 }

 參考資料:資料結構教程  李春葆版