线性表顺序存储
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 }