【新手】关于使用C语言创建数组及其API
介绍: 本篇内容只分享数据结构和算法中最初级的内容,创建数组以及其配套的一些API,答主也是新手,水平有限,看看就好。如果想了解写C语言的环境,答主后面会补上。希望能保持一周一更的状态,后面的内容陆续会有链表,队列,栈,树以及图等数据结的创建和相关操作。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdbool.h>struct Arr //创建一个结构体,结构体即为一整个数组。
{int * pBase; //创建创建结构体里的指针变量,可以用该变量的下标找到数组的元素int cnt; //代表数组的有效个数int len; //代表数组的长度
}; bool is_fulled(struct Arr * pArray) //判断数组是否已经装满了数据,后面会有需要
{if (pArray->cnt==pArray->len) //如果数组的有效个数与数组长度相等,则数组必定已经装满数据{return true;}else{return false;}
}bool append_arr(struct Arr * pArray,int val) //这是数组的一个追加方法,可以为数组最前面的空数据位置追加数据
{ if(is_fulled(pArray)) //调用了if_full方法,如果数组已满则终止程序{printf("数组已满,无法添加\n");exit(-1);return false;}else{pArray->pBase[pArray->cnt]=val; //用数据有效数据的个数作为下表,则添加数据的位置必然是空数据pArray->cnt++; //有效数据个数加1printf("%s%d%s","追加成功\n,有效数据为",pArray->cnt,"个\n");return true;}
}void init_arr (struct Arr *pArray,int length) //这是初始化数组方法
{pArray->len = length; //数组的长度由入参决定,并且把该长度赋予结构体的长度变量pArray->pBase =(int *)malloc(sizeof(int) * length); //用动态分配内存的方法把大小为int类型乘以数组长度的内存,以int类型划分,并且把每份内存的首个内存地址赋值给该结构体的内存地址变量 PS:int类型为4个字节if (NULL == pArray->pBase) //如果该结构体的内存地址变量为空,则内存必然分配失败,程序退出{printf("内存不足\n"); exit(-1);}else{pArray ->len = length; //如果成功,则数组长度为变更pArray ->cnt = 0;}return 0;
}bool is_empty(struct Arr * pArray) //这是判断数组是否为空的函数,为其他方法服务
{if(pArray ->cnt == 0){return true;}else{return false;}}void show_arr(struct Arr * pArray) //这是展现数据所有数据的函数
{if(is_empty(pArray)) //首先判断是否为空printf("数组为空\n");elsefor(int i=0;i<pArray->cnt;++i){ //不为空则用遍历的方式把每个数据打印出来if(pArray->pBase[i] != "\0"){printf("%d ",pArray->pBase[i]);}else{printf("Null ");};};printf("\n");
}bool insert_arr(struct Arr * pArray,int index,int val) //这是在数组中插入数据的函数,实现思路是,把插入下标右边的所有数据(包括下标本身)全部往右边移动一位,再把插入数据赋予该下标
{ if (is_fulled(pArray)==false && -1 <index < pArray->cnt) //首先需要判断数组是否已满,还需要判断下标是否为负数或者比数组的有效个数还大,增加方法的健壮性{for(int i=pArray->cnt;i!=index-1;--i) //将数据往右移动{pArray->pBase[i] = pArray->pBase[i-1];}pArray->pBase[index] = val; //将数据赋予该下标pArray->cnt++; //数组有效数据加1printf("插入成功\n");return true;}else{ printf("插入失败");return false;}
}bool delete_arr(struct Arr * pArray,int index) //删除函数,需要数组内存地址,和下标两个参数
{if (is_empty(pArray)) //判断数据是否为空{printf("数组为空,删除失败\n");return false;}if (pArray->cnt<index ) //判断有效个数是否比需要删除的下标还小{printf("目标数据错误,删除失败\n");return false;}int val = pArray->pBase[index]; //用一个变量将即将删除的下标保存起来,方便打印for(int i=index;i<pArray->cnt;++i) //将下标后面的值(不包括下标该数据)全部往前移动一格{pArray->pBase[i]=pArray->pBase[i+1]; }pArray->cnt--;printf("删除成功!值为%d\n",val); //打印已经删除的数据return true;
}void inversion_arr(struct Arr * pArray) //这是使数组前后反转的函数
{int val;int index = pArray->cnt-1; //将数组最后一个有效数据的下标赋值给一个变量for(int i=0;i<index;++i) //将第一个数据和最后一个数据交换,可以使用val这个临时变量辅助,在左边的下标大于或者等于最后的数据下标时(即重叠或者即将超过的那一次交换)停止循环{val =pArray->pBase[i];pArray->pBase[i]=pArray->pBase[index];pArray->pBase[index]=val;index--;}printf("数组成功反转!\n");
}void sort_arr(struct Arr *pArray) //对数组进行排序,其实就是一个冒泡,你们可以添加入参,可以调控排序从大到小还是从小到大,我就不写了。
{for(int i =0 ;i<pArray->cnt;++i){for (int p =0; p < pArray->cnt-i-1; ++p){if(pArray->pBase[p]>pArray->pBase[p+1]){int val = pArray->pBase[p];pArray->pBase[p]=pArray->pBase[p+1];pArray->pBase[p+1]=val;}}}printf("排序成功!\n");
}int main(void) //在main方法里调用上面的方法,调式已经看最后结果,你们可以任意使用和补充
{struct Arr arr;int length=6;init_arr(&arr,length);show_arr(&arr);append_arr(&arr,1);append_arr(&arr,2);append_arr(&arr,3);append_arr(&arr,4);append_arr(&arr,5);show_arr(&arr);insert_arr(&arr,1,99);show_arr(&arr);delete_arr(&arr,2);show_arr(&arr);inversion_arr(&arr);show_arr(&arr);sort_arr(&arr);show_arr(&arr);
}
各位有什么补充以及建议都可以评论给我,欢迎大家交流想法。
【新手】关于使用C语言创建数组及其API相关推荐
- java 中数组的创建 数组遍历 以及数组的输出(打印)
什么是数组? 如果我们需要创建一个 int 类型变量,那么我们只需要 int a; 如果我们需要创建五个 int 类型变量,那么我们只需要int a1; int a2; int a3; int a4; ...
- android 变量定义数组,android 创建数组
一: private String[] data = new String[]{"Hello", "jike", "world"}; 二: ...
- C语言——动态数组的创建和使用
C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...
- golang 初始化并赋值_Go语言创建、初始化数组的常见方式汇总
本文实例总结了Go语言创建.初始化数组的常见方式.分享给大家供大家参考.具体分析如下: Go语言的语法很灵活,以下展示了创建并初始化数组的多种方式: //数组初始化的各种方式 func arraySl ...
- Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组...
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译 ...
- 【C语言精讲】——创建数组、使用数组(一维数组、二维数组)
目录 一.一维数组的创建和初始化 1.1数组的创建 1.2数组的初始化 数组字符串的创建 strlen和sizeof的区别 1.3一维数组的使用 计算数组元素的个数 用指针访问数组(代替下标引用操作符 ...
- c语言之“数组”初级篇
前言 牛牛又和大家见面了,本篇牛牛要讲的内容是c语言中有关数组的内容. 欢迎大家一起学习,共同进步. 目录 前言 数组 一.一维数组 1.1 一维数组的创建 1.2 一维数组的初始化 1.3 一维数组 ...
- C语言一维数组、二维数组、结构体的初始化
C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...
- vba遍历数组_VBA代码解决方案的第59讲内容:如何在代码运行时创建数组
大家好,我们今日继续讲解VBA代码解决方案的第59讲内容:如何在代码运行时创建数组 .数组大家并不陌生,在之前我讲过很多了,估计详细阐述数组的只有我这个平台可以找到了,今日讲的是在VBA中代码运行的时 ...
最新文章
- 【 FPGA 】总线实现形式之选择器
- 云栖TechDay精华文章合集
- python点的作用-Python中*和**的作用(课堂小结)
- UVA12107Digit Puzzle数字字谜(迭代加深搜索)
- matlab simulink笔记08——from workspace和from file模块的区别
- js中 json详解
- 通过tomcat日志定位错误
- 计算机视觉基础-图像处理(边缘检测)cpp+python
- SQL数据库语言基础之SqlServer系统函数、聚合集合函数【大总结】
- 软件测试必读的七本书
- heatmap绘制热图时出现样本列名顺序调换
- Win7系统怎么开启远程桌面?Win7远程桌面怎么用
- PyAlgoTrade框架研究
- 【找工作必读】来自IT公司速查手册的各大IT公司薪资
- 数据报表类(BI)项目测试应该如何去啃?
- 802.11n 技术简结
- python主页_主页 - Python 宽客之道
- C# Winform Panel 内控件大小不随Panel大小改变设置
- Android TCP socket通信
- 基于近场动力学的二维疲劳裂纹扩展模型_如何抑制高强铝合金裂纹等缺陷,就在《铝及铝合金铸轧成形与裂纹扩展》...