毕业也有一段时间了,一直在做PHP开发,最近感觉到内功薄弱,所以是重新开始学习内功的时候了(参考郝斌数据结构视频教程)

 动态数组的实现,本文以C语言实现一个数组功能(抽取几个基本方法),包括初始化数组(init),添加数据到数组(append),插入数据到指定位置(insert),删除指定位置数据(delete),取得指定位置数据(get);

首先定义一个数据类型(使用结构体)Arr:

  1. struct Arr 
  2.     int * pBase; //存储的是数组第一个元素的地址 
  3.     int len; //数组所能容纳的最大元素的个数 
  4.     int cnt; //当前数组有效元素的个数 
  5. }; 

以下的操作都是针对该数据类型(struct Arr,本文中的数组都是指该数据类型)进行

1.初始化数组init

  1. /*  
  2. * 初始化数组 
  3. * @param pArr 指向待初始化的结构体的指针,因为要改变结构体变量的值, 所以用指针   
  4. * @param length 申请的数组长度,即数组的最大容量  
  5. * @return void  
  6. */  
  7. void init(struct Arr * pArr,int length){  
  8.    pArr->pBase = (int *)malloc(sizeof(int) * length);// pArr->pBase等价于(*pArr).pBase  
  9. //判断内存是否申请成功 
  10.   if(NULL == pArr->pBase){ 
  11.       printf("初始化失败 "); 
  12.       exit(-1); 
  13.    } 
  14.   pArr->len = length;//数组长度为length 
  15.   pArr->cnt = 0;//数组有效数据个数为0 
  16.   return;//可写可不写,代表函数到此完毕 
  17. }  

2.给数组添加数据append

  1. /* 
  2. * 从数组后面添加数据 
  3. * @param pArr 指向结构体Arr的指针 
  4. * @param date 添加的数据 
  5. * @return bool 
  6. */ 
  7. bool append(struct Arr * pArr,int date){ 
  8.      //数组已经达到最大容量,添加失败(也可以想java ArrayList一样动态添加容量,本文不实现了) 
  9.     if ( is_full(pArr) ) 
  10.         return false
  11.  
  12.     //没有达到最大容量时 
  13.     pArr->pBase[pArr->cnt] = date;  
  14.     pArr->cnt++; 
  15.     return true

3.从指定位置插入数据insert

  1. /*  
  2. * 从数组指定位置添加数据  
  3. * @param pArr 指向结构体Arr的指针  
  4. * @param pos 指定的位置 
  5. * @param date 添加的数据  
  6. * @return bool  
  7. */  
  8. bool insert(struct Arr * pArr, int pos, int date) 
  9.     int i; 
  10.     if (is_full(pArr))//同append 
  11.         return false
  12.  
  13.     if (pos<1 || pos>pArr->cnt+1)  //指定的位置不在数组范围内 
  14.         return false
  15.  
  16. //将位置大于pos的数据往后移位
  17.     for (i=pArr->cnt-1; i>=pos-1; --i) 
  18.     { 
  19.         pArr->pBase[i+1] = pArr->pBase[i]; 
  20.     } 
  21.     pArr->pBase[pos-1] = date; //将date添加到指定位置
  22.     pArr->cnt++; 
  23.     return true

4.删除指定位置数据delete

  1. /*   
  2. * 从数组指定位置删除数据   
  3. * @param pArr 指向结构体Arr的指针   
  4. * @param pos 指定的位置  
  5. * @return bool   
  6. */   
  7. bool delete_arr(struct Arr * pArr, int pos) 
  8.     int i; 
  9.     if ( is_empty(pArr) )//为空无法删除 
  10.         return false
  11.     if (pos<1 || pos>pArr->cnt)//指定的位置不在数组有值范围(不是最大范围) 
  12.         return false
  13.  
  14.     for (i=pos; icnt; ++i) 
  15.     { 
  16.         pArr->pBase[i-1] = pArr->pBase[i]; 
  17.     } 
  18.     pArr->cnt--; 
  19.     return true

5.查找指定位置数据get

  1. /*    
  2. * 查找指定位置数据    
  3. * @param pArr 指向结构体Arr的指针    
  4. * @param pos 指定的位置 ,从1开始  
  5. * @return int 
  6. */    
  7. int get(struct Arr * pArr,int pos){ 
  8.    if (pos < 1 || pos>pArr->cnt+1){ 
  9.       printf("查找的数据不存在 "); 
  10.       exit(-1); 
  11.     } 
  12.     return pArr->pBase[pos-1]; 

6.判断数组是否达到最大容量和是否为空的is_full和is_empty

  1. bool is_empty(struct Arr * pArr) 
  2.     if (0 == pArr->cnt) 
  3.         return true
  4.     else 
  5.         return false;        
  6.  
  7. bool is_full(struct Arr * pArr) 
  8.     if (pArr->cnt == pArr->len) 
  9.         return true
  10.     else 
  11.         return false

暂时只写这么多了,由于之前也没有写过这些东西,甚至都没有学过C,有什么错误的地方还望指正.