1. 程式人生 > >線性表的順序結構

線性表的順序結構

資料結構是演算法的基礎操作

線性表的順序結構操作有著快熟查詢的優勢

程式碼示例:

  1 #ifndef SQLIST_H_INCLUDED
  2 #define SQLIST_H_INCLUDED
  3 
  4 #include<iostream>
  5 #include<cstring>
  6 #include<string.h>
  7 #include<malloc.h>
  8 #include<stdlib.h>
  9 #include<stdio.h>
 10 #define LIST_INIT_SIZE 50
 11
#define LISTINCREMENT 10 12 using namespace std; 13 14 typedef int SeqType; //儲存單元型別 15 16 typedef struct{ 17 SeqType *elem; //儲存空間基地址 18 int length; //當前長度 19 int listsize; //當前分配的儲存容量(以sizeof(ElemType)為單位) 20 } SqList; 21 22 SqList createList_sq() { 23 //SqList list; 24 //return list;
25 26 SqList* list = (SqList*)malloc(sizeof(SqList)); 27 return *list; 28 } 29 30 int initList_sq(SqList &L) { 31 L.elem = (SeqType *) malloc(sizeof(SeqType) * LIST_INIT_SIZE); 32 if (!L.elem) 33 return 0; //記憶體分配失敗,儲存空間不夠 34 L.length = 0; //表示順序表為空 35 L.listsize = LIST_INIT_SIZE; //
表示順序表裡,最大儲存單元個數 36 return 1; 37 } 38 39 int insertList_sq(SqList &L, int index, SeqType val) { 40 if (index > L.length) { //儲存的下表超出順序表實際的長度 41 printf("插入的下標超出順序表的實際長度"); 42 return 0; 43 } 44 if (index < 0) //下標是負數,插入到結尾 45 index = L.length; 46 if (L.length == L.listsize) { //順序表的儲存單元已經存滿 47 printf("順序表的儲存單元已滿,繼續分配新的儲存單元。"); 48 SeqType* newBase = (SeqType*) realloc(L.elem, 49 (L.listsize + LISTINCREMENT) * sizeof(SeqType)); //繼續分配儲存單元 50 if (!newBase) { 51 printf("分配記憶體單元失敗"); 52 return 0; 53 } 54 L.elem = newBase; 55 L.listsize += LISTINCREMENT; 56 } 57 //尋找合適的插入位置,index後面的元素向後移動 58 for (int i = L.length; i > index; i--) { 59 L.elem[i] = L.elem[i - 1]; //向後移動 60 } 61 L.elem[index] = val; //插入元素 62 L.length++; 63 return 1; 64 } 65 66 /** 67 * 插入順序表(結尾的位置) 68 * 與上面的函式是重名函式,這叫函式過載,在C++裡面支援 69 */ 70 int insertList_sq(SqList &L, SeqType val) { 71 return insertList_sq(L, L.length, val); 72 } 73 74 /** 75 * 刪除指定的元素 76 * 返回0 找不到指定的元素,刪除失敗。 77 * 返回1 找到待刪除的元素,刪除成功。 78 */ 79 int removeList_sq(SqList &L, SeqType val) { 80 int index = -1; //記錄匹配到的下標 81 for (int i = 0; i < L.length; i++) { 82 if (L.elem[i] == val) { 83 //找到匹配的val,結束迴圈 84 index = i; 85 break; 86 } 87 } 88 if (index < 0) 89 return 0; 90 for (; index < L.length - 1; index++) { 91 L.elem[index] = L.elem[index + 1]; 92 } 93 L.length--; 94 return 1; 95 } 96 /** 97 * 根據下標刪除是指定的結點,並返回元素的值 98 * 返回0 下標超出順序表長度,刪除失敗。 99 * 返回1 下標正確,刪除元素,並且將已刪除元素值轉給elem 100 */ 101 int removeList_sq(SqList &L, int index, SeqType &elem) { 102 if (index >= L.length) //下標超出順序表的長度 103 return 0; 104 index = index < 0 ? L.length : index; //下標負數表示刪除最後一個節點 105 elem = L.elem[index]; 106 for (int i = index; i < L.length - 1; i++) { 107 L.elem[i] = L.elem[i + 1]; 108 } 109 L.length--; 110 return 1; 111 } 112 /** 113 * 銷燬順序表 114 */ 115 void destoryList_sq(SqList &L) { 116 free(L.elem); //釋放儲存空間 117 L.length = 0; 118 L.listsize = 0; 119 // free(&L); 120 } 121 void DisplayList(SqList &L) 122 { 123 for(int i=0;i<L.length;i++) 124 cout<<L.elem[i]<<" "; 125 cout<<endl; 126 } 127 int DelElemList(SqList &L,SeqType e) {//刪除指定的值: 128 129 for(int i=0;i<L.length;i++) 130 { 131 if(L.elem[i]==e) 132 { 133 for(int j=i;j<L.length-1;j++) 134 { 135 L.elem[j]=L.elem[j+1]; 136 } 137 L.length--; 138 } 139 } 140 return 1; 141 } 142 int combine(SqList &La,SqList &Lb,SqList &Lc) 143 { 144 int i=0; 145 int j=0; 146 while(i<La.length&&j<Lb.length) 147 { 148 if(La.elem[i]<Lb.elem[j]) 149 { 150 insertList_sq(Lc,La.elem[i]); 151 i++; 152 } 153 else 154 { 155 insertList_sq(Lc,Lb.elem[j]); 156 j++; 157 } 158 159 } 160 while(i<La.length){ 161 insertList_sq(Lc,La.elem[i]); 162 i++; 163 } 164 while(j<Lb.length){ 165 insertList_sq(Lc,Lb.elem[j]); 166 j++; 167 } 168 169 cout<<"合併後Lc元素"<<endl; 170 DisplayList(Lc); 171 return 0; 172 } 173 int combine2(SqList &La,SqList &Lb,SqList &Ld) 174 { 175 int i=0; 176 int j=0; 177 int k=0; 178 // Ld.elem[0]=0; 179 while(i<La.length&&j<Lb.length) 180 { 181 if(La.elem[i]<=Lb.elem[j]) 182 { 183 if(La.elem[i]>Ld.elem[k-1]||Ld.length==0) 184 { 185 insertList_sq(Ld,La.elem[i]); 186 k++; 187 } 188 i++; 189 } 190 else 191 { 192 if(Lb.elem[j]>Ld.elem[k-1]||Ld.length==0) 193 { 194 insertList_sq(Ld,Lb.elem[j]); 195 k++; 196 } 197 j++; 198 } 199 } 200 while(i<La.length){ 201 if(La.elem[i]>Ld.elem[k-1]||Ld.length==0) 202 { 203 insertList_sq(Ld,La.elem[i]); 204 k++; 205 } 206 i++; 207 } 208 while(j<Lb.length){ 209 if(Lb.elem[j]>Ld.elem[k-1]||Ld.length==0) 210 { 211 insertList_sq(Ld,Lb.elem[j]); 212 k++; 213 } 214 j++; 215 } 216 cout<<"合併(沒有重複的)後Ld元素"<<endl; 217 DisplayList(Ld); 218 } 219 220 #endif // SQLIST_H_INCLUDED