1// 2018-6-21 线性表顺序存储实现
#include<stdio.h> 2 3 #define MAXSIZE 20 // 存储空间初始分配量 4 #define OK 1 5 #define ERROR 0 6 #define TRUE 1 7 #define FALSE 0 8 typedef int Status; 9 typedef int ElemType; // ElemType根据情况设定,这里为 int 10 11 typedef struct 12 { 13 ElemType data[MAXSIZE]; // 数组存储数据元素 14 int length; // 线性表当前长度 为data中元素个数 15 }SqList; 16 17 // 初始化操作 18 Status InitList(SqList *L) 19 { 20 L->length = 0; 21 return OK; 22 } 23 24 // 若线性表为空 25 int ListEmpty(SqList L) 26 { 27 if(L.length == 0) 28 return 1; 29 else 30 return 0; 31 } 32 33 // 清空线性表 34 Status ClearList(SqList *L) 35 { 36 L->length = 0; 37 return OK; 38 } 39 40 // 在 L 中查找 e ,成功返回序号,否则返回 0 表示失败 41 int LocateElem(SqList L,ElemType e) 42 { 43 int i; 44 if(L.length == 0) 45 return 0; 46 for(i = 0;i<L.length;i++) 47 { 48 if(L.data[i] == e) 49 return i+1; 50 } 51 return 0; 52 } 53 54 // 在 L 中第 i 个位置插入e 55 Status ListInsert(SqList *L,int i,ElemType e) 56 { 57 int k; 58 // 线性表满 59 if(L->length == MAXSIZE) 60 return ERROR; 61 // 插入的位置不在范围内 62 if(!(i>=1 && i <= L->length+1)) 63 return ERROR; 64 // 插入的位置不在表尾 65 if(i != L->length+1) 66 { 67 for(k = L->length-1;k>=i-1;k--) 68 L->data[k+1] = L->data[k]; 69 } 70 L->data[i-1] = e; 71 L->length++; 72 73 return OK; 74 } 75 76 // 删除线性表第 i 个位置元素,并用 e 返回 77 Status ListDelete(SqList *L,int i,ElemType *e) 78 { 79 int k; 80 if(L->length == 0) 81 return ERROR; 82 if(!(i>=1 && i<=L->length)) 83 return ERROR; 84 85 *e = L->data[i-1]; 86 87 if(i!=L->length) 88 { 89 for(k = i;k<=L->length-1;k++) 90 L->data[k-1] = L->data[k]; 91 } 92 L->length--; 93 } 94 95 // 返回线性表长度 96 int ListLength(SqList L) 97 { 98 return L.length; 99 } 100 101 // 用 e 返回 L 中第 i 个数据元素的值 102 Status GetElem(SqList L,int i,ElemType *e) 103 { 104 if(L.length == 0 || i < 1 || i > L.length) 105 return ERROR; 106 *e = L.data[i-1]; 107 return OK; 108 } 109 110 // 合并 :将存在于Lb中不存在La中的元素插入到La中 111 void UnionL(SqList *La,SqList Lb) 112 { 113 int La_len,Lb_len,i; 114 ElemType e; 115 116 La_len = ListLength(*La); 117 Lb_len = ListLength(Lb); 118 119 for(i = 1;i<=Lb_len;i++) 120 { 121 GetElem(Lb,i,&e); 122 if(!LocateElem(*La,e)) 123 ListInsert(La,++La_len,e); 124 } 125 } 126 127 // 遍历线性表 128 int ListTraverse(SqList L) 129 { 130 int i; 131 for(i = 0;i<L.length;i++) 132 printf("%d ",L.data[i]); 133 printf(" "); 134 return OK; 135 } 136 137 int main() 138 { 139 SqList L,Lb; 140 int i,j,k; 141 ElemType e; 142 143 i = InitList(&L); 144 printf("初始化后:L.Length = %d ",L.length); 145 146 for(j = 1;j<=5;j++) 147 ListInsert(&L,1,j); 148 printf("在表头依次插入1~5后,L->data = "); 149 ListTraverse(L); 150 151 printf("L.Length = %d ",L.length); 152 i = ListEmpty(L); 153 printf("L是否空:i = %d (1:是 0:否) ",i); 154 155 i = ClearList(&L); 156 printf("清空后:L.Length = %d ",L.length); 157 i = ListEmpty(L); 158 printf("L是否空:i = %d (1:是 0:否) ",i); 159 160 for(j = 1;j<=10;j++) 161 ListInsert(&L,j,j); 162 printf("在表头依次插入1~10后,L->data = "); 163 ListTraverse(L); 164 printf("L.Length = %d ",L.length); 165 166 i = ListInsert(&L,1,0); 167 printf("在表头依次插入0后,L->data = "); 168 ListTraverse(L); 169 printf("L.Length = %d ",L.length); 170 171 GetElem(L,5,&e); 172 printf("第5个元素的值为:%d ",e); 173 174 for(j = 3;j<=4;j++) 175 { 176 k = LocateElem(L,j); 177 if(k) 178 printf("元素%d的位序为%d ",j,k); 179 else 180 printf("没有值为%d的元素 ",j); 181 } 182 printf(" "); 183 184 j = 6; 185 i = ListDelete(&L,j,&e); 186 if(i == ERROR) 187 printf("删除第%d个元素失败 ",j); 188 else 189 printf("删除第%d个元素的值为%d ",j,e); 190 ListTraverse(L); 191 printf("L.Length = %d ",L.length); 192 193 i = InitList(&Lb); 194 for(j = 6;j<=15;j++) 195 i = ListInsert(&Lb,1,j); 196 197 printf("Lb.data:"); 198 ListTraverse(Lb); 199 printf("L.data:"); 200 ListTraverse(L); 201 printf(" "); 202 203 UnionL(&L,Lb); 204 printf("L.Length = %d ",L.length); 205 printf("依次输出合并了Lb后的元素:"); 206 ListTraverse(L); 207 printf("L.Length = %d ",L.length); 208 209 return 0; 210 }