关于c中无法使用动态数组的简单解决办法

原文地址:http://panqiujuan.blog.163.com/blog/static/92852374201082732727233/

 

#include<stdio.h>
#include<stdlib.h> //需要include这个头文件,后面malloc库函数要用它

 

void main()
{
    int n,i;
    int *a; //需要这么声明动态数组,也就是先声明一个指针
    printf("enter the num of elements:");
    scanf("%d",&n);

    a=(int *)malloc(n*sizeof(int));//取得数组的成员个数后,需要动态的申请数组空间

    for(i=0;i<n;i++)
      a[i]=i+1;

    printf("Output: ");

    for(i=0;i<n;i++) printf("%d ",a[i]);

    free(a);
    //delete a;//动态数组使用完毕后不要忘了释放所申请的数组空间
}

 

链表建立动态数组:

 数组的有点在于随机存取,然而其不足也是明显的,就是一旦建立其大小就不能改变。若用数组存储数据,则必须创建一个可能存放的最大空间的数组,这无疑浪费了空间。动态数组解决了这个问题。动态数组的思路是:先建立一定大小的数组,向这个 数组中存放数据,如果数组已满,则重新申请一个更大的空间来存放。每次重新申请时可以指定增量(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 * sizeof( elem_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;
    if( index > 0 && index < array->iCount )
    ...{
        array->pData[index] = val;
        bRet = TRUE;
    }
    return bRet;
}
elem_t * getRef( Array_t * array, int index )                         //得到指定位置元素的引用(地址)
...{
    elem_t * eRet = NULL;
    if( index > 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;
}

继续学习的话向下看原文 http://zhidao.baidu.com/question/112765442.html

两种方法:
1.转化为一维数组申请
2.先申请全部行首指针,再按行逐行申请

 

1.
a=(int *)malloc(sizeof(int),(unsigned)m*n);
使用的时候就和一般的二维数组一样。
举个例子给你:
#include "stdlib.h"
#include "stdio.h"
#include <malloc.h>

int main()
{
int i,j;
int n;//这个就是需要指定的行数
int (*p)[10];

scanf("%d",&n);//取得行数

//动态生成二维数组,指定列数为10,如果想改,自己该里面
的参数,如果想定义n行2列就为: p=(int (*)[2])malloc(n*2*sizeof(int));
p=(int (*)[10])malloc(n*10*sizeof(int)); //动态申请n行10列的二维数组

for(i=0;i<n;i++)
for(j=0;j<10;j++)
p[i][j]=i*j;

for(i=0;i<n;i++)
{
for(j=0;j<10;j++)
printf("%d,",p[i][j]);

printf("\n");
}
free(p);

return 0;
}

2.
这个也给你举个例子吧:
#include <stdio.h>
#include <malloc.h>
main()
{
int i = 0;
int j = 0;
int line = 0;
int row = 0;
int **p = NULL;

printf("input the line of the array:\n");
scanf("%d", &line);
printf("input the row of the array:\n");
scanf("%d", &row);

p = (int **)malloc(sizeof(int *) * line);
if (NULL == p)
{
return;
}
for (i = 0; i < line; i++)
{
*(p + i) = (int *)malloc(sizeof(int) * row);
if (NULL == *(p + i))
{
return;
}
}
/*input data*/
for (i = 0; i < line; i++)
{
for(j = 0; j < row; j++)
{
p[i][j] = i + 1;
}
}
/*output data*/
for (i = 0; i < line; i++)
{
for(j = 0; j < row; j++)
{
printf("%d", p[i][j]);
}
}
/*free every line point*/
for (i = 0; i < line; i++)
{
free(*(p + i));
p[i] = NULL;
}

free(p);
p = NULL;
}

第一种方法数组创建和释放都比较简单

 

转载于:https://www.cnblogs.com/songqiuming/archive/2010/12/14/1905731.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值