线性表顺序存储方式的C语言实现

  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 }

 

posted @ 2015-09-14 16:40  钢铁侠Mac  阅读(411)  评论(0编辑  收藏  举报