1 #include "stdio.h" 2 3 #include "stdlib.h" 4 #include "io.h" 5 #include "math.h" 6 #include "time.h" 7 8 #define OK 1 9 #define ERROR 0 10 #define TRUE 1 11 #define FALSE 0 12 13 #define MAXSIZE 20 /* 存儲空間初始分配量 */ 14 15 typedef int Status; /* Status是函數的類型,其值是函數結果狀態代碼,如OK等 */ 16 typedef int ElemType; /* ElemType類型根據實際狀況而定,這裏假設爲int */ 17 18 19 Status visit(ElemType c) 20 { 21 printf("%d ",c); 22 return OK; 23 } 24 25 typedef struct 26 { 27 ElemType data[MAXSIZE]; /* 數組,存儲數據元素 */ 28 int length; /* 線性表當前長度 */ 29 }SqList; 30 31 /* 初始化順序線性表 */ 32 Status InitList(SqList *L) 33 { 34 L->length=0; 35 return OK; 36 } 37 38 /* 初始條件:順序線性表L已存在。操做結果:若L爲空表,則返回TRUE,不然返回FALSE */ 39 Status ListEmpty(SqList L) 40 { 41 if(L.length==0) 42 return TRUE; 43 else 44 return FALSE; 45 } 46 47 /* 初始條件:順序線性表L已存在。操做結果:將L重置爲空表 */ 48 Status ClearList(SqList *L) 49 { 50 L->length=0; 51 return OK; 52 } 53 54 /* 初始條件:順序線性表L已存在。操做結果:返回L中數據元素個數 */ 55 int ListLength(SqList L) 56 { 57 return L.length; 58 } 59 60 /* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) */ 61 /* 操做結果:用e返回L中第i個數據元素的值,注意i是指位置,第1個位置的數組是從0開始 */ 62 Status GetElem(SqList L,int i,ElemType *e) 63 { 64 if(L.length==0 || i<1 || i>L.length) 65 return ERROR; 66 *e=L.data[i-1]; 67 68 return OK; 69 } 70 71 /* 初始條件:順序線性表L已存在 */ 72 /* 操做結果:返回L中第1個與e知足關係的數據元素的位序。 */ 73 /* 若這樣的數據元素不存在,則返回值爲0 */ 74 int LocateElem(SqList L,ElemType e) 75 { 76 int i; 77 if (L.length==0) 78 return 0; 79 for(i=0;i<L.length;i++) 80 { 81 if (L.data[i]==e) 82 break; 83 } 84 if(i>=L.length) 85 return 0; 86 87 return i+1; 88 } 89 90 91 /* 初始條件:順序線性表L已存在,1≤i≤ListLength(L), */ 92 /* 操做結果:在L中第i個位置以前插入新的數據元素e,L的長度加1 */ 93 Status ListInsert(SqList *L,int i,ElemType e) 94 { 95 int k; 96 if (L->length==MAXSIZE) /* 順序線性表已經滿 */ 97 return ERROR; 98 if (i<1 || i>L->length+1)/* 當i比第一位置小或者比最後一位置後一位置還要大時 */ 99 return ERROR; 100 101 if (i<=L->length) /* 若插入數據位置不在表尾 */ 102 { 103 for(k=L->length-1;k>=i-1;k--) /* 將要插入位置以後的數據元素向後移動一位 */ 104 L->data[k+1]=L->data[k]; 105 } 106 L->data[i-1]=e; /* 將新元素插入 */ 107 L->length++; 108 109 return OK; 110 } 111 112 /* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) */ 113 /* 操做結果:刪除L的第i個數據元素,並用e返回其值,L的長度減1 */ 114 Status ListDelete(SqList *L,int i,ElemType *e) 115 { 116 int k; 117 if (L->length==0) /* 線性表爲空 */ 118 return ERROR; 119 if (i<1 || i>L->length) /* 刪除位置不正確 */ 120 return ERROR; 121 *e=L->data[i-1]; 122 if (i<L->length) /* 若是刪除不是最後位置 */ 123 { 124 for(k=i;k<L->length;k++)/* 將刪除位置後繼元素前移 */ 125 L->data[k-1]=L->data[k]; 126 } 127 L->length--; 128 return OK; 129 } 130 131 /* 初始條件:順序線性表L已存在 */ 132 /* 操做結果:依次對L的每一個數據元素輸出 */ 133 Status ListTraverse(SqList L) 134 { 135 int i; 136 for(i=0;i<L.length;i++) 137 visit(L.data[i]); 138 printf("\n"); 139 return OK; 140 } 141 142 void unionL(SqList *La,SqList Lb) 143 { 144 int La_len,Lb_len,i; 145 ElemType e; 146 La_len=ListLength(*La); 147 Lb_len=ListLength(Lb); 148 for (i=1;i<=Lb_len;i++) 149 { 150 GetElem(Lb,i,&e); 151 if (!LocateElem(*La,e)) 152 ListInsert(La,++La_len,e); 153 } 154 } 155 156 int main() 157 { 158 159 SqList L; 160 SqList Lb; 161 162 ElemType e; 163 Status i; 164 int j,k; 165 i=InitList(&L); 166 printf("初始化L後:L.length=%d\n",L.length); 167 for(j=1;j<=5;j++) 168 i=ListInsert(&L,1,j); 169 printf("在L的表頭依次插入1~5後:L.data="); 170 ListTraverse(L); 171 172 printf("L.length=%d \n",L.length); 173 i=ListEmpty(L); 174 printf("L是否空:i=%d(1:是 0:否)\n",i); 175 176 i=ClearList(&L); 177 printf("清空L後:L.length=%d\n",L.length); 178 i=ListEmpty(L); 179 printf("L是否空:i=%d(1:是 0:否)\n",i); 180 181 for(j=1;j<=10;j++) 182 ListInsert(&L,j,j); 183 printf("在L的表尾依次插入1~10後:L.data="); 184 ListTraverse(L); 185 186 printf("L.length=%d \n",L.length); 187 188 ListInsert(&L,1,0); 189 printf("在L的表頭插入0後:L.data="); 190 ListTraverse(L); 191 printf("L.length=%d \n",L.length); 192 193 GetElem(L,5,&e); 194 printf("第5個元素的值爲:%d\n",e); 195 for(j=3;j<=4;j++) 196 { 197 k=LocateElem(L,j); 198 if(k) 199 printf("第%d個元素的值爲%d\n",k,j); 200 else 201 printf("沒有值爲%d的元素\n",j); 202 } 203 204 205 k=ListLength(L); /* k爲表長 */ 206 for(j=k+1;j>=k;j--) 207 { 208 i=ListDelete(&L,j,&e); /* 刪除第j個數據 */ 209 if(i==ERROR) 210 printf("刪除第%d個數據失敗\n",j); 211 else 212 printf("刪除第%d個的元素值爲:%d\n",j,e); 213 } 214 printf("依次輸出L的元素:"); 215 ListTraverse(L); 216 217 j=5; 218 ListDelete(&L,j,&e); /* 刪除第5個數據 */ 219 printf("刪除第%d個的元素值爲:%d\n",j,e); 220 221 printf("依次輸出L的元素:"); 222 ListTraverse(L); 223 224 //構造一個有10個數的Lb 225 i=InitList(&Lb); 226 for(j=6;j<=15;j++) 227 i=ListInsert(&Lb,1,j); 228 229 unionL(&L,Lb); 230 231 printf("依次輸出合併了Lb的L的元素:"); 232 ListTraverse(L); 233 234 return 0; 235 }