顺序表 基本操作

 1 实验1  顺序表基本操作
 2 
 3 实验目的
 4 1.  熟悉C语言的上机环境,掌握C语言的基本结构。
 5 2.  会定义线性表的顺序存储结构。
 6 3.  熟悉对顺序表的一些基本操作和具体的函数定义。
 7 注意事项
 8 在做第一次“数据结构”课程实验之前,要在硬盘上建立好自己的工作目录,专门来存储你所做的实验程序及相关信息,以后每次做实验都采用这个目录。
 9 实验内容
10 该程序的功能是对元素类型为整型的顺序表进行一些操作。该程序包括顺序表结构类型的定义以及对顺序表操作的具体的函数定义和主函数。
11 /* 定义DataType为int类型 */
12 typedef int DataType;
13  
14 /*顺序表存储空间的总分配量*/
15 #define MAXSIZE 100
16  
17 /* 顺序存储类型 */
18 typedef struct
19 {DataType data[MAXSIZE]; /*存放线性表的数组*/
20 int length;               /* length是顺序表的长度*/
21 }SeqList;
22  
23 /* 初始化顺序表 */
24 SeqList SeqListInit( )
25  
26 /* 清空顺序表 */
27 void ListClear(SeqList L)
28  
29 /* 求顺序表长度 */
30 int ListLength(SeqList L)
31  
32 /* 检查顺序表是否为空 */
33 int ListEmpty(SeqList L)
34  
35 /*检查顺序表是否为满 */
36 int ListFull(SeqList L)
37  
38 /* 遍历顺序表 */
39 void ListTraverse(SeqList L)
40  
41 /* 从顺序表中查找元素 */
42 DataType ListGet(SeqList L ,int i)
43  
44 /* 从顺序表中查找与给定元素值相同的元素在顺序表中的位置 */
45 int ListLocate(SeqList L, DataType x)
46  
47 /* 向顺序表中插入元素 */
48 void ListInsert(SeqList L,int i,DataType x)
49  
50 /* 从顺序表中删除元素 */
51 void ListDelete(SeqList L,int i) 
52  
53 /*求顺序表中元素的前驱*/
54 DataType ListPrior (SeqList L,DataType e)
55  
56 /*求顺序表中元素的后继*/
57 DataType ListNext(SeqList L,DataType e)

参考:

  1 // 实验1 顺序表基本操作 
  2 #include <stdio.h>
  3 #include <malloc.h>
  4 #include <stdlib.h>
  5 
  6 /* 定义DataType为int类型 */
  7 
  8 typedef int DataType;
  9  
 10 
 11 /*顺序表存储空间的总分配量*/
 12 
 13 #define MAXSIZE 100
 14 
 15 /* 顺序存储类型 */
 16 
 17 typedef struct{
 18         DataType data[MAXSIZE]; /*存放线性表的数组*/
 19         int length;               /* length是顺序表的长度*/
 20 }SeqList;
 21 
 22 /* 1.初始化顺序表 */
 23 
 24 SeqList SeqListInit( )
 25 {
 26     SeqList sq;    //分配线性表的存储空间
 27     sq.length = 0;
 28     return sq;
 29 }
 30  
 31 
 32 /* 2.清空顺序表 */
 33 
 34 void ListClear(SeqList *L)
 35 {
 36     L->length =    0;
 37 }
 38  
 39 
 40 /* 3.求顺序表长度 */
 41 
 42 int ListLength(SeqList L)
 43 {
 44     return L.length;
 45 }
 46 
 47 /* 4.检查顺序表是否为空 */
 48 
 49 int ListEmpty(SeqList L)
 50 {
 51     if(L.length==0)    //是空的
 52         return 1;
 53     else    //不是空的
 54         return 0;
 55 }
 56  
 57 
 58 /* 5.检查顺序表是否为满 */
 59 
 60 int ListFull(SeqList L)
 61 {
 62     if(L.length==MAXSIZE)    //满了
 63         return 1;
 64     else 
 65         return 0;
 66 }
 67  
 68 
 69 /* 6.遍历顺序表 */
 70 
 71 void ListTraverse(SeqList L)
 72 {
 73      int i;
 74      for(i=0;i<L.length;i++){
 75         printf("%d ",L.data[i]);                                     
 76      }
 77      printf("\n");
 78 }
 79  
 80 
 81 /* 7.从顺序表中查找元素 */
 82 
 83 DataType ListGet(SeqList L ,int i)
 84 {
 85     return L.data[i-1];
 86 }
 87 
 88  
 89 
 90 /* 8.从顺序表中查找与给定元素值相同的元素在顺序表中的位置 */
 91 
 92 int ListLocate(SeqList L, DataType x)
 93 {
 94     int i;
 95     for(i=0;i<L.length;i++){
 96         if(L.data[i]==x)
 97             return i+1;
 98     }
 99     return 0;
100 }
101 
102  
103 
104 /* 9.向顺序表中插入元素 */
105 
106 void ListInsert(SeqList* L,int i,DataType x)
107 {
108     if(L->length==MAXSIZE){    //顺序表已经满了,不能再插入元素了 
109         printf("插入失败,顺序表已满!\n");
110         return ;
111     }
112     if(i>L->length+1 || i<1){
113         printf("插入失败,要插入的位置不在范围内!\n");
114         return ;
115     }
116     int j;
117     for(j=L->length-1;j>=i-1;j--)    //元素后移 
118         L->data[j+1] = L->data[j];
119     L->data[i-1] = x;    //插入 
120     L->length++;    //长度加1
121     printf("插入成功!\n");
122     return ;
123 }
124 
125  
126 
127 /* 10.从顺序表中删除元素 */
128 
129 void ListDelete(SeqList* L,int i)  
130 {
131     if(L->length==0){    //顺序表已经空了,不能再删除元素了 
132         printf("删除失败,顺序表已空!\n");
133         return ;
134     }
135     if(i>L->length || i<1){
136         printf("删除失败,要删除的位置不在范围内!\n");
137         return ;
138     }
139     int j;
140     for(j=i;j<L->length;j++){    //向前覆盖 
141         L->data[j-1] = L->data[j];    
142     }
143     L->length--;    //长度减1
144     printf("删除成功!\n");
145     return ;
146 }
147 
148  
149 
150 /* 11.求顺序表中元素的前驱*/
151 
152 DataType ListPrior (SeqList L,DataType e)
153 {
154     int i;
155     for(i=0;i<L.length;i++)
156         if(L.data[i]==e)
157             break;    
158     if(i==L.length)    //如果没有找到元素e 
159         return 0;
160     if(i==0)        //如果e是第一个元素,则没有前驱 
161         return 0;
162     return L.data[i-1];
163 }
164 
165  
166 
167 /* 12.求顺序表中元素的后继*/
168 
169 DataType ListNext(SeqList L,DataType e)
170 {
171     int i;
172     for(i=0;i<L.length;i++)
173         if(L.data[i]==e)
174             break;    
175     if(i==L.length)    //如果没有找到元素e 
176         return 0;
177     if(i==L.length-1)    //如果e是最后一个元素,说明他没有后继 
178         return 0;
179     return L.data[i+1];
180 }
181 
182 int Menu()
183 {
184     int in;
185     printf("[1] 初始化顺序表\n");
186     printf("[2] 清空顺序表\n");
187     printf("[3] 求顺序表长度\n");
188     printf("[4] 检查顺序表是否为空\n");
189     printf("[5] 检查顺序表是否为满\n");
190     printf("[6] 遍历顺序表\n");
191     printf("[7] 从顺序表中查找元素\n");
192     printf("[8] 从顺序表中查找与给定元素值相同的元素在顺序表中的位置\n");
193     printf("[9] 向顺序表中插入元素\n");
194     printf("[10] 从顺序表中删除元素\n");
195     printf("[11] 求顺序表中元素的前驱\n");
196     printf("[12] 求顺序表中元素的后继\n");
197     printf("[0] 按任意键退出\n");
198     scanf("%d",&in);
199     return in;
200 }
201 SeqList Reply(SeqList sq,int in)
202 {
203     int i,x;
204     switch(in){
205         case 1:    //初始化顺序表
206             if(sq.length==-1){
207                 sq = SeqListInit();
208                 printf("初始化成功!\n");
209             }
210             else{
211                 printf("已经初始化过了!\n");
212             }
213             break;
214         case 2:    //清空顺序表
215             if(sq.length==-1){
216                 printf("请先初始化顺序表!\n");
217                 break;
218             }
219             ListClear(&sq);
220             printf("清空成功!\n");
221             break;
222         case 3:    //求顺序表长度
223             if(sq.length==-1){
224                 printf("请先初始化顺序表!\n");
225                 break;
226             }
227             printf("顺序表长度为:%d\n",ListLength(sq));
228             break;
229         case 4:    //检查顺序表是否为空
230             if(sq.length==-1){
231                 printf("请先初始化顺序表!\n");
232                 break;
233             }
234             if(ListEmpty(sq))
235                 printf("顺序表为空!\n");
236             else 
237                 printf("顺序表不为空!\n");
238             break;
239         case 5:    //检查顺序表是否为满
240             if(sq.length==-1){
241                 printf("请先初始化顺序表!\n");
242                 break;
243             }
244             if(ListFull(sq))
245                 printf("顺序表已满!\n");
246             else 
247                 printf("顺序表未满!\n");
248             break;
249         case 6:    //遍历顺序表
250             if(sq.length==-1){
251                 printf("请先初始化顺序表!\n");
252                 break;
253             }
254             ListTraverse(sq);
255             break;
256         case 7:    //从顺序表中查找元素
257             if(sq.length==-1){
258                 printf("请先初始化顺序表!\n");
259                 break;
260             }
261             printf("你要查找第几个元素?\n");
262             scanf("%d",&i);
263             if(i>sq.length || i<1){
264                 printf("查找失败,该位置不在当前查找范围之内!\n");
265                 break;
266             }
267             printf("第%d个元素是:%d\n",i,ListGet(sq,i));
268             break;
269         case 8:    //从顺序表中查找与给定元素值相同的元素在顺序表中的位置
270             if(sq.length==-1){
271                 printf("请先初始化顺序表!\n");
272                 break;
273             }
274             printf("你要查找的元素值是?\n");
275             scanf("%d",&x);
276             if(i = ListLocate(sq,x))
277                 printf("这是第%d个元素!\n",i);
278             else 
279                 printf("没找到该元素!\n");
280             break;
281         case 9:    //向顺序表中插入元素
282             if(sq.length==-1){
283                 printf("请先初始化顺序表!\n");
284                 break;
285             }
286             printf("请问你要插在第几个元素的位置?\n");
287             scanf("%d",&i);
288             printf("你要插入的元素值是?\n");
289             scanf("%d",&x);
290             ListInsert(&sq,i,x);
291             break;
292         case 10:    //从顺序表中删除元素
293             if(sq.length==-1){
294                 printf("请先初始化顺序表!\n");
295                 break;
296             }
297             printf("请问你要删除第几个元素?\n");
298             scanf("%d",&i);
299             ListDelete(&sq,i);
300             break;
301         case 11:    //求顺序表中元素的前驱
302             if(sq.length==-1){
303                 printf("请先初始化顺序表!\n");
304                 break;
305             }
306             printf("请问你要查找的元素值为?\n");
307             scanf("%d",&x);
308             x = ListPrior(sq,x);
309             if(x)
310                 printf("该元素的前驱为:%d\n",x);
311             else
312                 printf("没找到前驱!\n");
313             break;
314         case 12:    //求顺序表中元素的后继
315             if(sq.length==-1){
316                 printf("请先初始化顺序表!\n");
317                 break;
318             }
319             printf("请问你要查找的元素值为?\n");
320             scanf("%d",&x);
321             x = ListNext(sq,x);
322             if(x)
323                 printf("该元素的后继为:%d\n",x);
324             else
325                 printf("没找到后继!\n");
326             break;
327         default://检查顺序表是否为满
328             printf("Bye~\n");
329             exit(1);
330     }
331     system("pause");
332     system("cls");
333     return sq;
334 }
335 
336 int main()
337 {
338     SeqList sq;
339     sq.length = -1;
340     while(1){
341         int in;
342         in = Menu();
343         sq = Reply(sq,in);
344     }
345     return 0;
346 }

 

posted @ 2014-09-08 14:03  琴心剑魄  阅读(464)  评论(0编辑  收藏  举报