介绍: 本篇内容只分享数据结构和算法中最初级的内容,创建数组以及其配套的一些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相关推荐

  1. java 中数组的创建 数组遍历 以及数组的输出(打印)

    什么是数组? 如果我们需要创建一个 int 类型变量,那么我们只需要 int a; 如果我们需要创建五个 int 类型变量,那么我们只需要int a1; int a2; int a3; int a4; ...

  2. android 变量定义数组,android 创建数组

    一: private String[] data = new String[]{"Hello", "jike", "world"}; 二: ...

  3. C语言——动态数组的创建和使用

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  4. golang 初始化并赋值_Go语言创建、初始化数组的常见方式汇总

    本文实例总结了Go语言创建.初始化数组的常见方式.分享给大家供大家参考.具体分析如下: Go语言的语法很灵活,以下展示了创建并初始化数组的多种方式: //数组初始化的各种方式 func arraySl ...

  5. Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组...

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译 ...

  6. 【C语言精讲】——创建数组、使用数组(一维数组、二维数组)

    目录 一.一维数组的创建和初始化 1.1数组的创建 1.2数组的初始化 数组字符串的创建 strlen和sizeof的区别 1.3一维数组的使用 计算数组元素的个数 用指针访问数组(代替下标引用操作符 ...

  7. c语言之“数组”初级篇

    前言 牛牛又和大家见面了,本篇牛牛要讲的内容是c语言中有关数组的内容. 欢迎大家一起学习,共同进步. 目录 前言 数组 一.一维数组 1.1 一维数组的创建 1.2 一维数组的初始化 1.3 一维数组 ...

  8. C语言一维数组、二维数组、结构体的初始化

    C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始 ...

  9. vba遍历数组_VBA代码解决方案的第59讲内容:如何在代码运行时创建数组

    大家好,我们今日继续讲解VBA代码解决方案的第59讲内容:如何在代码运行时创建数组 .数组大家并不陌生,在之前我讲过很多了,估计详细阐述数组的只有我这个平台可以找到了,今日讲的是在VBA中代码运行的时 ...

最新文章

  1. 【 FPGA 】总线实现形式之选择器
  2. 云栖TechDay精华文章合集
  3. python点的作用-Python中*和**的作用(课堂小结)
  4. UVA12107Digit Puzzle数字字谜(迭代加深搜索)
  5. matlab simulink笔记08——from workspace和from file模块的区别
  6. js中 json详解
  7. 通过tomcat日志定位错误
  8. 计算机视觉基础-图像处理(边缘检测)cpp+python
  9. SQL数据库语言基础之SqlServer系统函数、聚合集合函数【大总结】
  10. 软件测试必读的七本书
  11. heatmap绘制热图时出现样本列名顺序调换
  12. Win7系统怎么开启远程桌面?Win7远程桌面怎么用
  13. PyAlgoTrade框架研究
  14. 【找工作必读】来自IT公司速查手册的各大IT公司薪资
  15. 数据报表类(BI)项目测试应该如何去啃?
  16. 802.11n 技术简结
  17. python主页_主页 - Python 宽客之道
  18. C# Winform Panel 内控件大小不随Panel大小改变设置
  19. Android TCP socket通信
  20. 基于近场动力学的二维疲劳裂纹扩展模型_如何抑制高强铝合金裂纹等缺陷,就在《铝及铝合金铸轧成形与裂纹扩展》...

热门文章

  1. 虚幻商城人物替换默认小白人(不同骨骼模型人物公用一套动画)
  2. Mysql复制表结构、表数据以及修改主键
  3. TFTP文件传输协议
  4. ajax怎么请求数据,简单快捷
  5. Unity debugger detected e0030 sentinel ldk protection system
  6. c语言模拟银行ATM的程序,简单模拟银行ATM取款系统 | C/C++程序员之家
  7. 防范IFEO映像劫持
  8. Linux-命令 返回上一级目录
  9. 蓝屏 0x00000001 问题怎么解决?
  10. BMW专注研发、5年累计超50亿欧元