C语言建立动态数组

原文地址:C语言建立动态数组 作者:zhliang

C语言建立动态数组

数组的有点在于随机存取,然而其不足也是明显的,就是一旦建立其大小就不能改变。若用数组存储数据,则必须创建一个可能存放的最大空间的数组,这无 疑浪费了空间。动态数组解决了这个问题。动态数组的思路是:先建立一定大小的数组,向这个  数组中存放数据,如果数组已满,则重新申请一个更大的空间来存 放。每次重新申请时可以指定增量(inc)的大小,也可以固定大小。这样做的好处是空间浪费不多,最多浪费(inc-1)个元素空间,其不足是重新申请空 间浪费时间,每次重新申请空间时须将原来的数据拷贝到新申请的空间,当数组很大时,这种浪费还是相当可观的。稍后将用链表和数组结合解决这一问题。

先建立动态数组的存储结构:

typedef unsigned char        BOOL;
typedef int elem_t;                 //存放数据类型
typedef  struct
{
   
int           iCount;          //数据个数(数组中实际存放元素的个数)
    int           iCapacity;     //容量(数组中能够容纳元素的最大个数)
    elem_t  * pData;         //数据指针(该指针指向存放数据空间的首地址)
} Array_t;

下面定义数组的基本操作,包括:

1、初始化;
2、设置元素的值;
3、取得元素的引用(C语言中指地址);
4、取得元素的值;
5、销毁数组

以下是上面五个操作的函数声明:

BOOL initArray( Array_t  *  array,  int  size );                             // 初始化,size为指定初始化数组容量
BOOL setValue( Array_t  *  array,  int  index, elem_t val );     // 设置指定位置元素的值
elem_t  *  getRef( Array_t  *  array,  int  index );                        // 得到指定位置元素的引用(地址)
elem_t getValue( Array_t  *  array,  int  index );                       // 得到指定位置元素的值
BOOL destroyArray( Array_t  *  array );                                  // 销毁该数组

以下是函数实现:

#define  INIT_DATA_NUM 10                                             // 数组初始化大小,增量大小

BOOL initArray( Array_t 
*  array,  int  size                               // 初始化,若size <= 0,则采用默认大小
{
    BOOL bRet 
= FALSE;
   
int initSize = (size > 0? size:INIT_DATA_NUM;

    array
->pData = elem_t * )malloc( initSize * sizeofelem_t) );
   
if array->pData != NULL )
   
{
        array
->iCapacity = initSize;
        array
->iCount = 0;
        bRet 
= TRUE;
    }

   
return bRet;
}


BOOL setValue( Array_t 
*  array,  int  index, elem_t val      // 设置指定位置元素的值
   BOOL bRet = FALSE;
   
ifindex > 0 && index < array->iCount )
   
{
        array
->pData[index] = val;
        bRet 
= TRUE;
    }

   
return bRet;
}

elem_t 
*  getRef( Array_t  *  array,  int  index                          // 得到指定位置元素的引用(地址)
{
    elem_t 
* eRet = NULL;
   
ifindex > 0 && index < array->iCount )
   
{
        eRet 
= array->pData + index;
    }

   
return eRet;
}


elem_t getValue( Array_t 
*  array,  int  index                        // 得到指定位置元素的值(不检查数组越界)
{
   
return array->pData[index];
}


BOOL destroyArray( Array_t 
*  array                                    // 销毁该数组
{
    free( array
->pData );
    array
->pData = NULL;
   
return TRUE;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值