C语言建立动态数组
C语言建立动态数组
数组的有点在于随机存取,然而其不足也是明显的,就是一旦建立其大小就不能改变。若用数组存储数据,则必须创建一个可能存放的最大空间的数组,这无疑浪费了空间。动态数组解决了这个问题。动态数组的思路是:先建立一定大小的数组,向这个 数组中存放数据,如果数组已满,则重新申请一个更大的空间来存放。每次重新申请时可以指定增量(inc)的大小,也可以固定大小。这样做的好处是空间浪费不多,最多浪费(inc-1)个元素空间,其不足是重新申请空间浪费时间,每次重新申请空间时须将原来的数据拷贝到新申请的空间,当数组很大时,这种浪费还是相当可观的。稍后将用链表和数组结合解决这一问题。
先建立动态数组的存储结构:
typedef unsigned char     BOOL;
typedef int elem_t;![]() //存放数据类型
         //存放数据类型
 //存放数据类型
         //存放数据类型typedef struct
![]() {
{
![]() int           iCount;          //数据个数(数组中实际存放元素的个数)
    int           iCount;          //数据个数(数组中实际存放元素的个数)
![]() int           iCapacity;     //容量(数组中能够容纳元素的最大个数)
    int           iCapacity;     //容量(数组中能够容纳元素的最大个数)
![]() elem_t  * pData;         //数据指针(该指针指向存放数据空间的首地址)
    elem_t  * pData;         //数据指针(该指针指向存放数据空间的首地址)
![]() }Array_t;
}Array_t;
 {
{ int           iCount;          //数据个数(数组中实际存放元素的个数)
    int           iCount;          //数据个数(数组中实际存放元素的个数) int           iCapacity;     //容量(数组中能够容纳元素的最大个数)
    int           iCapacity;     //容量(数组中能够容纳元素的最大个数) elem_t  * pData;         //数据指针(该指针指向存放数据空间的首地址)
    elem_t  * pData;         //数据指针(该指针指向存放数据空间的首地址) }Array_t;
}Array_t;下面定义数组的基本操作,包括:
1、初始化;
2、设置元素的值;
3、取得元素的引用(C语言中指地址);
4、取得元素的值;
5、销毁数组
以下是上面五个操作的函数声明:
 BOOL initArray( Array_t * array, int size );                             //初始化,size为指定初始化数组容量
BOOL initArray( Array_t * array, int size );                             //初始化,size为指定初始化数组容量 BOOL setValue( Array_t * array, int index, elem_t val );    //设置指定位置元素的值
BOOL setValue( Array_t * array, int index, elem_t val );    //设置指定位置元素的值 elem_t * getRef( Array_t * array, int index );                        //得到指定位置元素的引用(地址)
elem_t * getRef( Array_t * array, int index );                        //得到指定位置元素的引用(地址) elem_t getValue( Array_t * array, int index );                      //得到指定位置元素的值
elem_t getValue( Array_t * array, int index );                      //得到指定位置元素的值 BOOL destroyArray( Array_t * array );                                  //销毁该数组
BOOL destroyArray( Array_t * array );                                  //销毁该数组以下是函数实现:
 #define INIT_DATA_NUM 10                                            //数组初始化大小,增量大小
#define INIT_DATA_NUM 10                                            //数组初始化大小,增量大小
 BOOL initArray( Array_t * array, int size )                              //初始化,若size <= 0,则采用默认大小
BOOL initArray( Array_t * array, int size )                              //初始化,若size <= 0,则采用默认大小 {
{ BOOL bRet = FALSE;
    BOOL bRet = FALSE; int initSize = (size > 0) ? size:INIT_DATA_NUM;
    int initSize = (size > 0) ? size:INIT_DATA_NUM;
 array->pData = ( elem_t * )malloc( initSize * sizeof( elem_t) );
    array->pData = ( elem_t * )malloc( initSize * sizeof( elem_t) ); if ( array->pData != NULL )
    if ( array->pData != NULL ) {
    { array->iCapacity = initSize;
        array->iCapacity = initSize; array->iCount = 0;
        array->iCount = 0; bRet = TRUE;
        bRet = TRUE; }
    } return bRet;
    return bRet; }
}
 BOOL setValue( Array_t * array, int index, elem_t val )     //设置指定位置元素的值
BOOL setValue( Array_t * array, int index, elem_t val )     //设置指定位置元素的值 {
{ BOOL bRet = FALSE;
    BOOL bRet = FALSE; if( index > 0 && index < array->iCount )
    if( index > 0 && index < array->iCount ) {
    { array->pData[index] = val;
        array->pData[index] = val; bRet = TRUE;
        bRet = TRUE; }
    } return bRet;
    return bRet; }
} elem_t * getRef( Array_t * array, int index )                         //得到指定位置元素的引用(地址)
elem_t * getRef( Array_t * array, int index )                         //得到指定位置元素的引用(地址) {
{ elem_t * eRet = NULL;
    elem_t * eRet = NULL; if( index > 0 && index < array->iCount )
    if( index > 0 && index < array->iCount ) {
    { eRet = array->pData + index;
        eRet = array->pData + index; }
    } return eRet;
    return eRet; }
}
 elem_t getValue( Array_t * array, int index )                       //得到指定位置元素的值(不检查数组越界)
elem_t getValue( Array_t * array, int index )                       //得到指定位置元素的值(不检查数组越界) {
{ return array->pData[index];
    return array->pData[index]; }
}
 BOOL destroyArray( Array_t * array )                                   //销毁该数组
BOOL destroyArray( Array_t * array )                                   //销毁该数组 {
{ free( array->pData );
    free( array->pData ); array->pData = NULL;
    array->pData = NULL; return TRUE;
    return TRUE; }
}
这样关于动态数组的基本操作就完成了。后面将说明动态数组的一些高级操作,像:遍历、查找、排序、拷贝等操作。
 
                    
                
 
     
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号