1 /*
2 编译器VC6++
3 文件名1.cpp
4 代码版本号:1.0
5 时间:2015年9月14日16:39:21
6 */
7 #include <stdio.h>
8 #include <stdlib.h>
9
10 #define OK 1
11 #define ERROR 0
12 #define TRUE 1
13 #define FALSE 0
14 #define OVERFLOW -2
15 #define LIST_INIT_SIZE 10
16 #define LIST_INCREMENT 10
17
18 typedef int ElemType;
19 typedef int Status;
20 typedef struct{
21 ElemType *base;
22 int length;
23 int listsize;
24 } Sqlist;
25
26 Status initSqlist(Sqlist *l)//初始化线性表,分配容量
27 {
28 (*l).base = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
29
30 if (!((*l).base))
31 exit(OVERFLOW);
32 (*l).length =0;
33 (*l).listsize =LIST_INIT_SIZE;
34 return OK;
35 }
36
37 Status assignSqlist(Sqlist *l) //按位序assign值到线性表中
38 {
39 int i;
40 if(l->base!=NULL)
41 {
42 l->length=LIST_INIT_SIZE;
43 for (i = 0; i < LIST_INIT_SIZE; i++)
44 (l->base)[i] = i;
45 return OK;
46 }
47 else
48 return ERROR;
49 }
50
51 Status ListInsert(Sqlist *l, int i, ElemType e) //元素插入
52 {
53 ElemType *newbase=NULL;
54 ElemType *q;
55 //ElemType *p = (*l).base + i - 1;
56 if (i<1 || i>(*l).length + 1)
57 {
58 printf("请插入在第1-%d个元素之间", (*l).length + 1);
59 return 0;
60 }
61 if ((*l).length >= (*l).listsize)
62 {
63 printf("我执行了");
64 newbase = (ElemType *)realloc((*l).base,
65 ((*l).listsize + LIST_INCREMENT) * sizeof(ElemType));
66 if (!newbase)
67 exit(0);
68 (*l).base = newbase; // 新基址
69 (*l).listsize += LIST_INCREMENT; // 增加存储容量
70 }
71 for (q = (*l).base + (*l).length - 1; q >= (*l).base + i-1;q--)
72 *(q + 1) = *q;
73
74 *((*l).base + i - 1) = e;
75 (*l).length++;
76 return OK;
77 }
78
79 Status GetElem(Sqlist *l,int i,ElemType *e)
80 {
81 if(i>=1&&i<=l->length)
82 {
83 *e=l->base[i-1];
84 return OK;
85 }
86 else
87 {
88 printf("您输入的元素位序不合法\n");
89 return ERROR;
90 }
91 }
92
93 Status mergeList(Sqlist *lc,Sqlist la,Sqlist lb)
94 {
95 int i=1;
96 int j=1;
97 ElemType *a=la.base;
98 ElemType *b=lb.base;
99 ElemType *c;
100 lc->listsize=lc->length=la.length+lb.length;
101 lc->base=(ElemType *)malloc(lc->listsize*sizeof(ElemType));
102 if(!lc->base)
103 exit(OVERFLOW);
104
105 c=lc->base;
106
107 while(i<=la.length&&j<=lb.length)
108 {
109 if(*a<=*b)
110 {
111 *c++=*a++;
112 i++;
113 }
114 else
115 {
116 *c++=*b++;
117 j++;
118 }
119 }
120
121 while(i<=la.length)
122 {
123 *c++=*a++;
124 i++;
125 }
126 while(j<=lb.length)
127 {
128 *c++=*b++;
129 j++;
130 }
131
132 return OK;
133 }
134
135 Status listDelete(Sqlist *l,int i,ElemType *e)
136 {
137 if(i<1||i>l->length) return ERROR;
138 ElemType *p=l->base+i-1;
139 *e=*p;
140 for(*p;p<(l->base+l->length-1);p++)
141 *p=*(p+1);
142
143 l->length--;
144 return OK;
145 }
146
147 Status priorElem(Sqlist *l,ElemType e,ElemType *prior_elem)
148 {
149 int i=1;
150 while(i<=l->length&&l->base[i-1]!=e)
151 {
152 i++;
153 }
154 if(i==(l->length+1))
155 {
156 printf("\n元素%d不在线性表中\n",e);
157 return ERROR;
158 }
159 else
160 {
161 if(i==1)
162 {
163 printf("该元素没有前驱\n");
164 return ERROR;
165 }
166 else
167 {
168 *prior_elem=l->base[i-2];
169 return OK;
170 }
171 }
172 }
173
174 Status nextElem(Sqlist *l,ElemType e,ElemType *next_elem)
175 {
176 int i=1;
177 while(i<=l->length&&l->base[i-1]!=e)
178 {
179 i++;
180 }
181 if(i==(l->length+1))
182 {
183 printf("\n元素%d不在线性表中\n",e);
184 return ERROR;
185 }
186 else
187 {
188 if(i==l->length)
189 {
190 printf("该元素没有后驱\n");
191 return ERROR;
192 }
193 else
194 {
195 *next_elem=l->base[i];
196 return OK;
197 }
198 }
199 }
200 /*
201 返回L中第1个与e满足关系compare()的数据元素的位序。
202 若这样的数据元素不存在,则返回值为0。
203 */
204 int locateElem(Sqlist *l,ElemType e,bool (*compare)(ElemType e,ElemType a))
205 {
206 int i=0;
207 while(i<=l->length&&!compare(e,l->base[i]))
208 i++;
209 if(i<=l->length)
210 return i+1;
211 else
212 return 0;
213 }
214
215 bool comp(ElemType e,ElemType a){
216 if(e==a)
217 return TRUE;
218 else
219 return FALSE;
220 }
221
222 Status printLinklist(Sqlist l) //遍历输出线性表中的元素
223 {
224
225 for (int i = 0; i < l.length; i++){
226 printf("\n第%d个数据为%d",i+1,(l.base)[i]);
227 }
228
229 return OK;
230 }
231
232 Status destroyList(Sqlist *l){//销毁线性表,释放空间
233
234 if(l->base!=NULL)
235 {
236 free(l->base);
237 l->length=0;
238 l->listsize=0;
239
240 return OK;
241 }
242 return ERROR;
243 }
244
245 Status clearList(Sqlist *l)//将线性表重置为长度为0的空表
246 {
247 l->length=0;
248 return OK;
249 }
250
251 bool isEmpty(Sqlist *l) //判断线性表是否是空表
252 {
253 if(l->length==0)
254 return TRUE;
255 else
256 return FALSE;
257 }
258
259 void main()
260 {
261 Sqlist L;
262 Sqlist La,Lb,Lc;
263 Status s = 1;//s为程序运行状态
264 int i;
265 ElemType theElem;
266 ElemType prior_elem;
267 ElemType next_elem;
268 ElemType e;
269
270 s = initSqlist(&L);
271
272 //合并3个线性表开始
273 initSqlist(&La);
274 initSqlist(&Lb);
275 initSqlist(&Lc);
276
277 int a[5]={1,5,8,12,20};
278 int b[10]={6,13,35,56,120,288,390,510,700,1000};
279
280 for(i=0;i<5;i++)
281 ListInsert(&La,La.length+1,a[i]);
282
283 for(i=0;i<10;i++)
284 ListInsert(&Lb,Lb.length+1,b[i]);
285
286 printLinklist(La);
287 printf("\n==================\n");
288 printLinklist(Lb);
289 printf("\n==================\n");
290
291 s=mergeList(&Lc,La,Lb);
292 printLinklist(Lc);
293 printf("\n==================\n");
294
295 //合并3个线性表结束
296
297 if(s)
298 s=assignSqlist(&L);
299
300 printLinklist(L);
301 printf("\n==================\n");
302 printf("请输入要获得的元素的位序: ");
303 scanf("%d",&i);
304 s=GetElem(&L,i,&e);
305 printf("\n线性表中位序为%d的元素为%d",i,e);
306 printf("\n==================\n");
307 printf("\n元素6在线性表表中的位序为%d",locateElem(&L,6,comp));
308 /*printf("请输入您要插入的元素: ");
309 scanf("%d", &theElem);
310 printf("请输入您要插入元素的位置: ");
311 scanf("%d", &i);
312 ListInsert(&L, i, theElem);*/
313 printf("\n==================\n");
314 printf("\n您删除第一个元素后的线性表为\n");
315 listDelete(&L,1,&e);
316 printLinklist(L);
317 printf("\n您删除的这个元素为%d",e);
318 printf("\n==================\n");
319 //前驱开始
320 priorElem(&L,1,&prior_elem);
321 printf("\n==================\n");
322 printf("元素1的前驱为%d",prior_elem);
323 printf("\n==================\n");
324 //前驱结束
325 //后继开始
326 nextElem(&L,9,&next_elem);
327 printf("\n==================\n");
328 printf("元素9的后继为%d",next_elem);
329 printf("\n==================\n");
330 //后继结束
331 if(s)
332 {
333 clearList(&L);
334 }
335
336 printLinklist(L);
337 system("pause");
338 }