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("\n");
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\n\n",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\n",L.length);
152 i = ListEmpty(L);
153 printf("L是否空:i = %d (1:是 0:否)\n\n",i);
154
155 i = ClearList(&L);
156 printf("清空后:L.Length = %d\n",L.length);
157 i = ListEmpty(L);
158 printf("L是否空:i = %d (1:是 0:否)\n\n",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\n\n",L.length);
165
166 i = ListInsert(&L,1,0);
167 printf("在表头依次插入0后,L->data = ");
168 ListTraverse(L);
169 printf("L.Length = %d\n\n",L.length);
170
171 GetElem(L,5,&e);
172 printf("第5个元素的值为:%d\n\n",e);
173
174 for(j = 3;j<=4;j++)
175 {
176 k = LocateElem(L,j);
177 if(k)
178 printf("元素%d的位序为%d\n",j,k);
179 else
180 printf("没有值为%d的元素\n",j);
181 }
182 printf("\n");
183
184 j = 6;
185 i = ListDelete(&L,j,&e);
186 if(i == ERROR)
187 printf("删除第%d个元素失败\n",j);
188 else
189 printf("删除第%d个元素的值为%d\n",j,e);
190 ListTraverse(L);
191 printf("L.Length = %d\n\n",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("\n");
202
203 UnionL(&L,Lb);
204 printf("L.Length = %d\n",L.length);
205 printf("依次输出合并了Lb后的元素:");
206 ListTraverse(L);
207 printf("L.Length = %d\n\n",L.length);
208
209 return 0;
210 }