山间桃花纷飞落,撑伞也是雨|

颜欢兮

园龄:2年1个月粉丝:1关注:0

1、顺序表

复制代码
  1 #include<stdio.h>
  2 #include<malloc.h>
  3 #include<stdbool.h>
  4 #define SEQLIST_INIT_SIZE 8
  5 typedef int ElemType;
  6 //结构体定义 
  7 typedef struct SeqList{
  8     ElemType* base;
  9     int size;
 10     int capacity;  
 11 }SeqList;
 12     
 13 //初始化结构体 
 14 void initSeqList(SeqList* seqList){
 15     seqList->base = (ElemType*)malloc(sizeof(SeqList) * SEQLIST_INIT_SIZE); //申请内存空间 
 16     seqList->size = 0;//初始顺序表当前大小为0 
 17     seqList->capacity = SEQLIST_INIT_SIZE;//顺序表容量为  SEQLIST_INIT_SIZE
 18 }
 19 ////尾插法
 20 //void push_back(SeqList* seqList,ElemType e){
 21 //    //判断容量是否已满 
 22 //    if(seqList->size >= seqList->capacity){
 23 //        printf("当前顺序表容量已满,不能向尾部插入数据>%d. \n",e);
 24 //        return;
 25 //    }
 26 //    //插入数据到尾部 
 27 //    seqList->base[seqList->size] = e;
 28 //    //数组当前容量大小 + 1 
 29 //    seqList->size++;
 30 //}
 31 
 32 //头插法
 33 void push_front(SeqList* seqList,ElemType e){
 34     //判断容量是否已满 
 35     if(seqList->size >= seqList->capacity){
 36         printf("当前顺序表容量已满,不能向头部插入数据>%d. \n",e);
 37         return;
 38     }
 39     int i = 0;
 40     //将数组当前所有元素后移 
 41     for(i = seqList->size; i > 0; i--){
 42         seqList->base[i] = seqList->base[i-1];
 43     }
 44     //插入数据到头部 
 45     seqList->base[0] = e;
 46     //数组当前容量大小 + 1 
 47     seqList->size++;
 48 }
 49 
 50 //显示数据中的所有数据
 51 void show_list(SeqList seqList){
 52     int i = 0;
 53     for(i = 0;i < seqList.size;i++){
 54         printf("%d ",seqList.base[i]);
 55     }
 56     printf("\n");
 57 }
 58 
 59 //删除尾部
 60 void pop_back(SeqList* seqList){
 61     //判断当前数组是否为空
 62     if(seqList->size == 0){
 63         printf("当前数组为空,不能进行删除尾部.\n");
 64         return;
 65     } 
 66     //只需更改size大小即可 
 67     seqList->size--;
 68 }
 69 
 70 //删除头部
 71 void pop_front(SeqList* seqList){
 72     //判断当前数组是否为空
 73     if(seqList->size == 0){
 74         printf("当前数组为空,不能进行删除头部.\n");
 75         return;
 76     } 
 77     int i = 1;
 78     //数组数据前移 
 79     for(i = 1;i < seqList->size;i++){
 80         seqList->base[i-1] = seqList->base[i];
 81     }
 82     //数组当前大小-1 
 83     seqList->size--;
 84 }
 85 
 86 //向顺序表的 position 位置插入 e 元素
 87 //注:这里位置为数据下标 
 88 void insert_pos(SeqList* seqList,int position,ElemType e){
 89     //判断 插入的位置[position] 是否合法 
 90     if(position < 0 || position > seqList->size){
 91         printf("插入的位置[position]不合法,不能插入数据.\n");
 92         return;
 93     }
 94     //判断当前数组是否已满
 95     if(seqList->size >= seqList->capacity){
 96         printf("当前数组已满,不能插入数据.\n");
 97         return;
 98     }
 99     
100     //    if(position == 0){
101     //        //如果插入的位置为第一个元素,则调用头插法函数 
102     //        push_front(seqList,e);
103     //    }else if(position == seqList->size){
104     //        //如果插入的位置为最后一个元素,则调用头插法函数 
105     //        push_back(seqList,e);
106     //    }else{
107     //        //如果既不是头部也不是尾部,
108     //        //在中间插入元素
109     //        int i = seqList->size;
110     //        for(i;i > position;i--){
111     //            seqList->base[i] = seqList->base[i - 1];
112     //        }
113     //        seqList->base[position] = e;
114     //        seqList->size++;
115     //    }
116     int i = seqList->size;
117     for(i;i > position;i--){
118         seqList->base[i] = seqList->base[i - 1];
119     }
120     seqList->base[position] = e;
121     seqList->size++;
122 }
123 
124 //查找顺序表元素 
125 int find(SeqList seqList,ElemType e){
126     int i = 0;
127     for(i;i < seqList.size;i++){
128         if(seqList.base[i] == e){
129             return i;
130         }
131     }
132     return -1;
133 }
134 
135 //顺序表长度
136 int length(SeqList seqList){
137     return seqList.size;
138 }
139  
140 //删除顺序表的 pos 位置的元素
141 //注: pos代表元素下标位置 
142 void delete_pos(SeqList* seqList,int pos){
143     if(pos < 0 || pos >= seqList->size){
144         printf("删除的数据位置不合法,不能删除数据.\n");
145         return;
146     }
147     int i = pos;
148     for(i;i< seqList->size - 1;i++){
149         seqList->base[i] = seqList->base[i+1];
150     }
151     seqList->size--;
152 }
153 
154 //按值删除元素
155 void delete_val(SeqList* seqList,ElemType e){
156     int pos = find(*seqList,e);
157     if(pos == -1){
158         printf("按值删除失败,当前val: %d 不存在顺序表中.\n",e);
159         return;
160     }
161     delete_pos(seqList,pos);
162 } 
163 
164 
165 
166 //排序(从小到大) 
167 void sort(SeqList* seqList){
168     int i = 0;
169     int size = seqList->size;
170     for(i;i < size - 1;i++){
171         int flag = 0;//判断这次循环是否有把元素前移
172         int j = 0; 
173         for(j;j < size - i;j++){
174             if(seqList->base[j] > seqList->base[j + 1]){
175                 ElemType temp = seqList->base[j];
176                 seqList->base[j] = seqList->base[j + 1];
177                 seqList->base[j + 1] = temp;
178                 flag = 1;//当前有变换 
179             }
180         }
181         if(flag == 0){
182             //说明当前已经排序好了 
183             return;
184         }
185         
186     }
187 } 
188 
189 //逆置顺序表
190 void reverse(SeqList* seqList){
191     int low = 0;
192     int high = seqList->size - 1;
193     while(low < high){
194         ElemType temp = seqList->base[low];
195         seqList->base[low] = seqList->base[high];
196         seqList->base[high] = temp;
197         low++;
198         high--;
199     }
200 } 
201 
202 //清空顺序表
203 void clear(SeqList* seqList){
204     seqList->size = 0;
205 }
206 
207 //销毁顺序表
208 void  destory(SeqList* seqList){
209     free(seqList->base);//释放所指的空间
210     seqList->base = NULL;
211     seqList->size = 0;
212     seqList->capacity = 0;
213 }
214 
215 #define INC_SIZE 8
216 //扩容
217 bool capacity_inc(SeqList* seqList){
218     ElemType* newBase = (ElemType*)realloc(seqList->base,sizeof(ElemType) * (seqList->capacity + INC_SIZE));
219     if(newBase == NULL){
220         printf("增配空间失败,内存不足.\n");    
221         return false;
222     }
223     seqList->base = newBase;
224     seqList->capacity += INC_SIZE;
225     return true;
226 } 
227 
228 //尾插法[扩容改进]
229 void push_back(SeqList* seqList,ElemType e){
230     //判断容量是否已满 且 是否可以进行扩容 
231     if(seqList->size >= seqList->capacity && !capacity_inc(seqList)){
232         printf("当前顺序表容量已满,不能向尾部插入数据>%d. \n",e);
233         return;
234     }
235     //插入数据到尾部 
236     seqList->base[seqList->size] = e;
237     //数组当前容量大小 + 1 
238     seqList->size++;
239 }
240 
241 //数组合并[从小到大]
242 void merge(SeqList* list,SeqList* list_a,SeqList* list_b){
243     list->capacity = list_a->size + list_b->size;
244 
245     list->base = (SeqList*) malloc(sizeof(ElemType) * list->capacity);
246     if(list->base == NULL){
247         printf("内存空间不足.\n");
248         return;
249     }
250     int index_a = 0;
251     int index_b = 0;
252     int index = 0;
253     while(index_a < list_a->size && index_b < list_b->size){
254         if(list_a->base[index_a] < list_b->base[index_b]){
255             list->base[index] = list_a->base[index_a];
256             index_a++;
257             index++;
258             //list->base[index++] = list_a->base[index_a++];
259         }else{
260             list->base[index] = list_b->base[index_b];
261             index_b++;
262             index++;
263             //list->base[index++] = list_b->base[index_b++];
264         }
265     }
266     while(index_a < list_a->size){
267         list->base[index++] = list_a->base[index_a++];
268     }
269     while(index_b < list_b->size){
270         list->base[index++] = list_b->base[index_b++];
271     }
272     list->size = list_a->size + list_b->size;
273 } 
274 int main(){
275     SeqList myList;
276     initSeqList(&myList);
277     int select = 1;
278     while(select){
279         printf("***********************************\n");
280         printf("* [1] push_back   [2] push_front  *\n");
281         printf("* [3] show_list   [4] pop_back    *\n");
282         printf("* [5] pop_front   [6] insert_pos  *\n");
283         printf("* [7] find        [8] length      *\n");
284         printf("* [9] delete_pos  [10] delete_val *\n");
285         printf("* [11] sort       [12] reverse    *\n");
286         printf("* [13] clear      [14] destory    *\n");
287         printf("* [0] quit_system                 *\n");
288         printf("***********************************\n");
289         printf("请选择:>");
290         scanf("%d",&select);
291         if(select == 0){
292             break;
293         }
294         int item = 0;
295         int pos = 0;
296         switch(select){
297             case 1:    
298                 printf("请输入要输入的数据(-1结束):>");
299                 while(scanf("%d",&item),item != -1){
300                     push_back(&myList,item);
301                 }
302                 break;
303             case 2:
304                 printf("请输入要输入的数据(-1结束):>");
305                 while(scanf("%d",&item),item != -1){
306                     push_front(&myList,item);
307                 }
308                 break;
309             case 3:
310                 show_list(myList);
311                 break;
312             case 4:
313                 pop_back(&myList);
314                 break;
315             case 5:
316                 pop_front(&myList);
317                 break;
318             case 6:
319                 printf("请输入要插入的位置:>",pos);
320                 scanf("%d",&pos);
321                 printf("请输入要输入的数据:>",item);
322                 scanf("%d",&item);
323                 insert_pos(&myList,pos,item);
324                 break;
325             case 7:
326                 printf("请输入要查找的数据:>");
327                 scanf("%d",&item);
328                 pos = find(myList,item);
329                 if(pos == -1){
330                     printf("查找到数据 %d 在顺序表中不存在.\n",item);
331                 }else{
332                     printf("找到数据 %d 在顺序表中的 %d 的位置.n",item,pos);
333                 }
334                 break;
335             case 8:
336                 printf("该顺序表长度为 %d.\n",length(myList));
337                 break;
338             case 9:
339                 printf("请输入要删除的位置:>");
340                 scanf("%d",&pos);
341                 delete_pos(&myList,pos);
342                 break; 
343             case 10:
344                 printf("请输入要删除的元素:>");
345                 scanf("%d",&item);
346                 delete_val(&myList,item);
347                 break; 
348             case 11:
349                 sort(&myList);
350                 return;
351             case 12:
352                 reverse(&myList);
353                 return;
354             case 13:
355                 clear(&myList);
356                 return;
357             case 14:
358                 destory(&myList);
359                 return;
360         }
361     }
362     return 0;
363 } 
复制代码

 

本文作者:颜欢兮

本文链接:https://www.cnblogs.com/xpp3/p/18403751

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   颜欢兮  阅读(8)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 《起风了》 林俊杰
  2. 2 晴天 (Live) 林俊杰,周杰伦
  3. 3 兰亭序 (Live) 周杰伦
  4. 4 反方向的钟 (Live) 我也不太了解她
晴天 (Live) - 林俊杰,周杰伦
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

晴天 (Live) - 林俊杰 (JJ Lin)/周杰伦 (Jay Chou)

词:周杰伦

曲:周杰伦

故事的小黄花

从出生那年就飘着

童年的荡秋千

随记忆一直晃到现在

Re so so si do si la

So la si si si si la si la so

唱好朋友写的歌

唱好朋友写的歌

其实我是来找你打电动的

为你翘课的那一天

花落的那一天

教室的那一间

我怎么看不见

消失的下雨天

我好想再淋一遍

没想到失去的勇气我还留着

没想到失去的勇气我还留着

好想再问一遍

好想再问一遍

你会等待还是离开

刮风这天我试着握着你手

刮风这天我试着握着你手

但偏偏雨渐渐大到我看你不见

还要多久我才能在你身边

还要多久我才能在你身边

等到放晴的那天

也许我会比较好一点

从前从前有个人爱你很久

但偏偏风渐渐把距离吹得好远

好不容易又能再多爱一天

好不容易又能再多爱一天

但故事的最后你好像还是说了拜拜

为你翘课的那一天

为你翘课的那一天

教室的那一间

花落的那一天

我怎么看不见

消失的下雨天

我好想再淋一遍

没想到失去的勇气我还留着

没想到失去的勇气我还留着

好想再问一遍

你会等待还是离开

刮风这天我试着握着你手

但偏偏雨渐渐大到我看你不见

还要多久我才能在你身边

还要多久我才能在你身边

等到放晴的那天

也许我会比较好一点

从前从前有个人爱你很久

但偏偏风渐渐把距离吹得好远

好不容易又能再多爱一天

好不容易又能再多爱一天

但故事的最后你好像还是说了拜拜

但故事的最后你好像还是说了拜拜

但故事的最后你好像还是说了拜拜