动态数组(例题详解)

一、了解堆区

#include<stdlib.h>
void main()
{
//空指针:
        int* pc=NULL;
//空指针类型:
        void* pa=NULL;
        int* pi=NULL;
//运算
        printf("%d %d",pi,pi+1);
        //printf("%d %d\n",pa,pa+1);//不知道指针类型,报错

//堆区:由malloc/realloc申请的空间,由free来释放
//申请一个整形空间
        int* p=(int*)malloc(sizeof(int))//申请4Byte空间,返回地址
//使用
        *p=1900;
        if(p!=NULL)//p不为空,说明malloc申请成功,p指向申请的空间。
                printf("%d\n",p);
// 释放
        if(NULL!=p)
        {
                free(p);
                p=NULL;
        }

        float* p=(float*)malloc(sizeof(float));
        if(p!=NULL)
                *p=1.2345;
        printf("%.4f\n",*p);
        if(p!=NULL)
        {
                free(p);
                p=NULL;
        }

}

二、动态数组

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//数组的 容量,长度,下标
struct Array
{
        int* data;      //记录堆区地址
        unsigned short len;//数组的长度
        short index;    //索引
};


void main()
{
//功能:1增加元素、2查找、3遍历
        int opt;
        //定义结构体变量:
        struct Array a={NULL,0,-1};//定义变量:分配空间
        int i;

        while(1)
        {
        printf("please input[1/2/3/0]:");
        scanf("%d",&opt);
                switch(opt)
                {
                        case 0:
                        {
                                if(a.len>0)
                                {
                                        printf("本程序已关闭\n");
                                        free(a.data);
                                        a.data=NULL;
                                        a.len=0;
                                        a.index=0;
                                        return ;
                                }
                        }
                        case 1://插入成绩:当容量不满足申请空间
                        {
                                int score;
                                printf("输入成绩:");
                                scanf("%d",&score);
                                //判断是否为满
                                if(a.index+1==a.len)//为满
                                {
                                        int* pnew=(int*)malloc((a.len+5)*sizeof(int));
                                        if(NULL!=pnew)
                                        {
                                                //老空间赋值给新空间
                                        memcpy(pnew,a.data,a.len*sizeof(int));
                                                a.len+=5;//长度为原来长度+5
                                                free(a.data);//释放
                                                a.data=pnew;//重新指向
                                        }
                                        else
                                        printf("请求失败");
                                }
                                //插入数据
                                a.data[++a.index]=score;
                        }
                        break;
                        case 2:
                        {
                                int grade;
                                printf("请输入查找的成绩:");
                                scanf("%d",&grade);
                                for(i=0;i<a.len;i++)
                                        if(a.data[i]==grade)
                                                printf("%d\n",a.data[i]);
                        }break;
                        case 3:
                        {
                                printf("遍历\n");
                                for(i=0;i<a.len;i++)
                                        if(a.data[i]!=NULL)
                                                printf("%d\n",a.data[i]);
                        }break;
                        default:
                                printf("输入有误\n");
                }
        }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅风叶落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值