动态数组

实现动态数组需要使用到堆区,主要的方法就是:

定义申请一个堆区空间,判断空间是否储存满了,如果满了就将重新申请一个空间,空间的长度相比以前更大,将原来的空间内容赋值给新的堆区,释放原来的堆区空间,将指针重新指向新的空间首地址。

下面是一个简单的案例,主要的功能是输入数据并将之储存到动态数组里面,由于代码过长,这里只有两个功能,1是输入数字,2是遍历输入的数字,0是退出,主要的动态数组实现在case1,其他过长的部分请省略。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct Array
{
        int* pa;                //堆区的地址
        unsigned short len;     //自定义数组长度
        short index;            //数组元素个数
};

void main()
{
//1.申请空间
        struct Array a={NULL,0,-1};     //初始化
//2.引用
        while(1)
        {

                int num,opt,i;
                printf("输入选项(0~2)");
                scanf("%d",&opt);
                switch(opt)
                {
                        case 1:
                        {
                                printf("输入数字");
                                scanf("%d",&num);
                                if(a.index+1==a.len)    //数组空间满
                                {
                                        //重新申请空间,增加10个空间长度
                        int* pb=(int*)malloc((a.len+10)*sizeof(int));
                                        if(NULL!=pb)
                                        {
                                        //将原来的数组元素赋值给新的数组
                                        memcpy(pb,a.pa,sizeof(int)*a.len);
                                        a.len+=10;
                                        //释放原来的空间;
   free(a.pa);
                                        //重新将指针指向新的数组
                                        a.pa=pb;
                                        }
                                }
                                //将输入的值存进数组
                                a.pa[++a.index]=num;
                        }break;
                        case 2:
                        {
                                for(i=0;i<=a.index;i++)
                                        printf("%d ",a.pa[i]);
                                printf("\n");
                        }break;
                        case 0:
                                return ;
                        default:
                                printf("输入错误\n");
                }
        }
}
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值