毕业也有一段时间了,一直在做PHP开发,最近感觉到内功薄弱,所以是重新开始学习内功的时候了(参考郝斌数据结构视频教程)
动态数组的实现,本文以C语言实现一个数组功能(抽取几个基本方法),包括初始化数组(init),添加数据到数组(append),插入数据到指定位置(insert),删除指定位置数据(delete),取得指定位置数据(get);
首先定义一个数据类型(使用结构体)Arr:
- struct Arr
- {
- int * pBase; //存储的是数组第一个元素的地址
- int len; //数组所能容纳的最大元素的个数
- int cnt; //当前数组有效元素的个数
- };
以下的操作都是针对该数据类型(struct Arr,本文中的数组都是指该数据类型)进行
1.初始化数组init
- /*
- * 初始化数组
- * @param pArr 指向待初始化的结构体的指针,因为要改变结构体变量的值, 所以用指针
- * @param length 申请的数组长度,即数组的最大容量
- * @return void
- */
- void init(struct Arr * pArr,int length){
- pArr->pBase = (int *)malloc(sizeof(int) * length);// pArr->pBase等价于(*pArr).pBase
- //判断内存是否申请成功
- if(NULL == pArr->pBase){
- printf("初始化失败 ");
- exit(-1);
- }
- pArr->len = length;//数组长度为length
- pArr->cnt = 0;//数组有效数据个数为0
- return;//可写可不写,代表函数到此完毕
- }
2.给数组添加数据append
- /*
- * 从数组后面添加数据
- * @param pArr 指向结构体Arr的指针
- * @param date 添加的数据
- * @return bool
- */
- bool append(struct Arr * pArr,int date){
- //数组已经达到最大容量,添加失败(也可以想java ArrayList一样动态添加容量,本文不实现了)
- if ( is_full(pArr) )
- return false;
- //没有达到最大容量时
- pArr->pBase[pArr->cnt] = date;
- pArr->cnt++;
- return true;
- }
3.从指定位置插入数据insert
- /*
- * 从数组指定位置添加数据
- * @param pArr 指向结构体Arr的指针
- * @param pos 指定的位置
- * @param date 添加的数据
- * @return bool
- */
- bool insert(struct Arr * pArr, int pos, int date)
- {
- int i;
- if (is_full(pArr))//同append
- return false;
- if (pos<1 || pos>pArr->cnt+1) //指定的位置不在数组范围内
- return false;
- //将位置大于pos的数据往后移位
- for (i=pArr->cnt-1; i>=pos-1; --i)
- {
- pArr->pBase[i+1] = pArr->pBase[i];
- }
- pArr->pBase[pos-1] = date; //将date添加到指定位置
- pArr->cnt++;
- return true;
- }
4.删除指定位置数据delete
- /*
- * 从数组指定位置删除数据
- * @param pArr 指向结构体Arr的指针
- * @param pos 指定的位置
- * @return bool
- */
- bool delete_arr(struct Arr * pArr, int pos)
- {
- int i;
- if ( is_empty(pArr) )//为空无法删除
- return false;
- if (pos<1 || pos>pArr->cnt)//指定的位置不在数组有值范围(不是最大范围)
- return false;
- for (i=pos; i
cnt; ++i) - {
- pArr->pBase[i-1] = pArr->pBase[i];
- }
- pArr->cnt--;
- return true;
- }
5.查找指定位置数据get
- /*
- * 查找指定位置数据
- * @param pArr 指向结构体Arr的指针
- * @param pos 指定的位置 ,从1开始
- * @return int
- */
- int get(struct Arr * pArr,int pos){
- if (pos < 1 || pos>pArr->cnt+1){
- printf("查找的数据不存在 ");
- exit(-1);
- }
- return pArr->pBase[pos-1];
- }
6.判断数组是否达到最大容量和是否为空的is_full和is_empty
- bool is_empty(struct Arr * pArr)
- {
- if (0 == pArr->cnt)
- return true;
- else
- return false;
- }
- bool is_full(struct Arr * pArr)
- {
- if (pArr->cnt == pArr->len)
- return true;
- else
- return false;
- }
暂时只写这么多了,由于之前也没有写过这些东西,甚至都没有学过C,有什么错误的地方还望指正.