1、顺序表

news/2025/1/15 18:51:25/文章来源:https://www.cnblogs.com/xpp3/p/18403751
  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 } 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/794265.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1-9Java数组

Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。 Java 语言中提供的数组是用来存储固定大小的同类型元素。 你可以声明一个数组变量,如 numbers[100] 来代替直接声明 100 个独立变量 number0,number1,....,numbe…

VR虚拟现实解决方案在电商行业中的7大优势

从电子商务的角度来看,虚拟现实可以通过多种方式为在线卖家带来好处。VR 可带来身临其境、富有创意且令人难忘的客户体验,可以极大地提高转化率。VR 可以通过更多方式使卖家受益。从电子商务的角度来看,虚拟现实可以通过多种方式为在线卖家带来好处。VR 可带来身临其境、富有…

Mathematica 入门

前言 Wolfram Mathematica(简称 MMA),是由 Wolfram Research 开发的科学计算软件。本文我们将介绍 Mathematica 的界面、语法和基本应用。类似的软件还有 MATLAB 和 Maple 等。 MMA 官网:https://www.wolfram.com/mathematica/ MMA 的安装及激活:Mathematica安装激活极简教…

【算法笔记】位运算详解

0. 前言 突然想到位运算是个好东西,就来水一波文章了…… 注意:我把能想到的有关位运算的所有内容都放进来了,所以篇幅较长,请谅解!若有写的不清楚或者不够详细的地方欢迎在评论区补充,谢谢支持! 本文中参考代码均使用C++编写。 废话不多说,下面步入正题。1. 基本运算 …

【算法笔记】【专题】RMQ 问题:ST表/树状数组/线段树

0. 前言 好久没更算法笔记专栏了,正好学了新算法来更新…… 这也是本专栏的第一个专题问题,涉及到三种数据结构,如果写得有问题请各位大佬多多指教,谢谢! 1. 关于 RMQ 问题 RMQ 的全称是 Range Minimum/Maximum Query,即区间最大/最小值问题。 本文中,我们的算法以求最大…

【算法笔记】树形DP算法总结详解

0. 定义 树形DP,又称树状DP,即在树上进行的DP,是DP(动态规划)算法中较为复杂的一种。 1. 基础 令\(f[u]=~\)与树上顶点\(u\)有关的某些数据,并按照拓扑序(从叶子节点向上到根节点的顺序)进行\(\text{DP}\),确保在更新一个顶点时其子节点的dp值已经被更新好,以更新当前…

Seay安装和初步使用

作者网站现在已经无法访问:http://www.cnseay.com/2951/, 可以使用这个GitHub - f1tz/cnseay: Seay源代码审计系统 下载完安装包之后,解压到自己想要的电脑路径即可,无需进行任何额外的配置 利用工具对sql注入进行分析 进入软件之后,点击新建项目,选择需要分析的文件(这里…

纸浆

日线: 小时线: 15分钟趋势: 关注5750一线支撑

代码整洁之道--读书笔记(5)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

02网络参考模型

02网络参考模型02网络参考模型常见网络模型因为 OSI协议栈比较复杂 ,且TCP和IP两大协议在业界被广泛使用,所以 TCP/IP参考模型 成为了互联网的主流参考模型。OIS网络模型层级作用7.应用层 应用层 对应用程序提供接口。6.表示层进行数据格式的转换,以确保一个系统生成的应用层…

《痞子衡嵌入式半月刊》 第 107 期

痞子衡嵌入式半月刊: 第 107 期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :《…

鼠标悬停显示的轮播图

今日整理,发现这种轮播图是最难实现的一种, 1.再循环中难以控制单一品类商品显示 解决办法: 在外面的主类里面添加&:hover触发标签属性的更改,这样可以单一作用 2.在循环中触发事件,所有的同一事件都会触发 解决办法:先建立模版控制排版,再从单一内容开始微调 <script s…