线性表顺序存储实现-动态数组
1 // 2018-06-22 2 // 线性表顺序存储实现-动态数组 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 #define LIST_INIT_SIZE 5 // 符号常量 ,线性表存储空间的初试分配量 7 #define LIST_INCREMENT 10 // 符号常量 ,线性表存储空间的分配增量 8 9 #define OK 1 10 #define ERROR 0 11 #define TRUE 1 12 #define FALSE 0 13 14 typedef int ElemType; 15 typedef int Status; 16 17 typedef struct sqList 18 { 19 ElemType *elem; // 存储空间基地址 20 int length; // 线性表当前长度 21 int listsize; // 当前分配的存储容量 22 }SqList; 23 24 25 /* 26 Status InitList(SqList *L); 27 Status ListInsert(SqList *L,int i,ElemType e); 28 Status ListTraverse(SqList L); 29 Status ListEmpty(SqList L); 30 Status ClearList(SqList *L); 31 Status GetElem(SqList L,int i,ElemType *e); 32 int LocateElem(SqList L,ElenType e); 33 Status ListDelete(SqList *L,int i,ElemType *e); 34 int ListLength(SqList L); 35 void UnionL(SqList *La,SqList Lb); 36 */ 37 38 // 初始化线性表 39 Status InitList(SqList *L) 40 { 41 L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)); 42 if (!(L->elem)) 43 return ERROR; 44 L->length = 0; // 空表长度为0 45 L->listsize = LIST_INIT_SIZE; // 初始化存储容量 46 47 return OK; 48 } 49 50 // 在 L 中第 i 个位置插入新的数据元素 e ,L 的长度增加 1 51 Status ListInsert(SqList *L, int i, ElemType e) 52 { 53 ElemType *newbase; 54 int k; 55 56 if (L->length == L->listsize) 57 { 58 // realloc(void *__ptr, size_t __size) 59 // 更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小 60 newbase = (ElemType *)realloc(L->elem, (L->listsize + LIST_INCREMENT) * sizeof(ElemType)); 61 if (!newbase) 62 return ERROR; 63 L->elem = newbase; 64 L->listsize += LIST_INCREMENT; 65 } 66 67 if (!(i >= 1 && i <= L->length + 1)) 68 return ERROR; 69 70 if (i != L->length + 1) // 插入的位置不在表尾 71 { 72 for (k = L->length - 1; k >= i - 1; k--) 73 *(L->elem + k + 1) = *(L->elem + k); 74 } 75 *(L->elem + i - 1) = e; 76 L->length++; 77 return OK; 78 } 79 80 Status ListTraverse(SqList L) 81 { 82 int i; 83 for (i = 0; i < L.length; i++) 84 { 85 printf("%d ", *(L.elem++)); 86 } 87 printf("\n"); 88 return OK; 89 } 90 91 Status ListEmpty(SqList L) 92 { 93 if (L.length == 0) 94 return OK; 95 else 96 return ERROR; 97 } 98 99 Status ClearList(SqList *L) 100 { 101 L->length = 0; 102 return OK; 103 } 104 105 Status GetElem(SqList L, int i, ElemType *e) 106 { 107 if (L.length == 0) return ERROR; 108 if (!(i >= 1 && i < L.length)) return ERROR; 109 *e = *(L.elem + i - 1); 110 return OK; 111 } 112 113 // 返回L中第1个与e满足关系的数据元素的位序 114 int LocateElem(SqList L, ElemType e) 115 { 116 int i; 117 if (L.length == 0) 118 return 0; 119 for (i = 0; i < L.length; i++) 120 { 121 if (*(L.elem + i) == e) 122 return i + 1; 123 } 124 return 0; 125 } 126 127 Status ListDelete(SqList *L, int i, ElemType *e) 128 { 129 int k; 130 if (L->length == 0) return ERROR; 131 if (!(i >= 1 && i <= L->length)) return ERROR; 132 133 *e = *(L->elem + i - 1); 134 if (i != L->length) 135 { 136 for (k = i; k <= L->length - 1; k++) 137 { 138 *(L->elem + k - 1) = *(L->elem + k); 139 } 140 } 141 L->length--; 142 return OK; 143 } 144 145 int ListLength(SqList L) 146 { 147 return L.length; 148 } 149 150 void UnionL(SqList *La, SqList Lb) 151 { 152 int La_len, Lb_len, i; 153 ElemType e; 154 155 La_len = ListLength(*La); 156 Lb_len = ListLength(Lb); 157 158 for (i = 1; i <= Lb_len; i++) 159 { 160 GetElem(Lb, i, &e); 161 if (!LocateElem(*La, e)) 162 ListInsert(La, ++La_len, e); 163 } 164 } 165 166 int main() 167 { 168 SqList La, Lb; 169 int i, j, k; 170 ElemType e; 171 172 i = InitList(&La); 173 174 for (j = 1; j <= 5; j++) 175 ListInsert(&La, 1, j); 176 printf("在L的表头插入1~5后,L->data = "); 177 ListTraverse(La); 178 printf("\n"); 179 180 printf("L.length = %d\n", La.length); 181 i = ListEmpty(La); 182 printf("L是否为空:i = %d (1:是 0:否)\n",i); 183 printf("\n"); 184 185 i = ClearList(&La); 186 printf("清空L后,L.length = %d\n", La.length); 187 i = ListEmpty(La); 188 printf("L是否为空:i = %d (1:是 0:否)\n", i); 189 printf("\n"); 190 191 for ( j = 0; j <= 10; j++) 192 ListInsert(&La, j, j); 193 printf("在L的表头插入1~10后,L->data = "); 194 ListTraverse(La); 195 printf("L.length = %d\n",La.length); 196 printf("\n"); 197 198 i = ListInsert(&La, 1, 0); 199 printf("在L的表头插入0后,L.data = "); 200 ListTraverse(La); 201 printf("L.length = %d\n", La.length); 202 printf("\n"); 203 204 GetElem(La, 5, &e); 205 printf("第 5 个元素的值为:%d\n", e); 206 printf("\n"); 207 208 for ( j = 3; j <= 4; j++) 209 { 210 k = LocateElem(La, j); // 查找位序 211 if (k) 212 printf("元素%d的位序是%d\n", j, k); 213 else 214 printf("没有值为%d的元素\n", j); 215 } 216 j = 9; 217 i = ListDelete(&La, j, &e); 218 if (i == ERROR) 219 printf("删除第%d个数据失败\n", j); 220 else 221 printf("删除第%d个元素的值为:%d\n", j, e); 222 printf("L.length = %d\n", La.length); 223 printf("L.data = "); 224 ListTraverse(La); 225 printf("\n"); 226 227 k = ListLength(La); 228 j = k + 1; // 删除第length+1个元素 229 i = ListDelete(&La, j, &e); 230 if (i == ERROR) 231 printf("删除第%d个数据失败\n", j); 232 else 233 printf("删除第%d个元素的值为%d\n", j, e); 234 i = InitList(&Lb); 235 for ( j = 8; j <= 15; j++) 236 i = ListInsert(&Lb, 1, j); 237 printf("依次输出Lb的元素:"); 238 ListTraverse(Lb); 239 printf("\n"); 240 UnionL(&La, Lb); 241 printf("L.length = %d\n", La.length); 242 printf("依次输出合并之后的L.data = "); 243 ListTraverse(La); 244 printf("\n"); 245 246 getchar(); 247 return 0; 248 }