数组的封装

1.增删改查功能的实现

2.要达到目标先了解下C语言中有关内存分配的几个函数 malloc,calloc,realloc

2.1下面的代码比较的是malloc,calloc

#include<stdio.h>
#include<stdlib.h>
void main()
{
    {
        printf("使用malloc函数分配内存,观察是否初始化内存\n");
        int  *p = (int *)malloc(10*sizeof(int));//分配内存

        if (p != NULL)
        {
            for (int i = 0; i < 10; i++)
            {
                printf("%d\n", p[i]);
            }
        }
    }
    {
        printf("使用calloc函数分配内存,观察是否初始化内存\n");
        int  *p = (int *)calloc(10, sizeof(int));//分配内存     
        if (p != NULL)
        {
            for (int i = 0; i < 10; i++)
            {
                printf("%d\n", p[i]);
            }
        }
    }
    system("pause");
}

注:程序运行结果表明calloc与malloc区别在于前者初始化内存数据为0.malloc_calloc

2.2 比较calloc 与realloc
realloc功能说明:
1.当前数组后面的内存没有使用中,就直接拓展变长 ,返回值(内存首地址)不变
2.当前数组后面的内存被占用,则先分配新的内存块,返回值(内存首地址)改变—->拷贝原来的内存—->释放原来的内存

#include<stdio.h>
#include<stdlib.h>
void main()
{           
    int  *p = (int *)calloc(10, sizeof(int));//分配内存     
    if (p != NULL)
    {
        printf("calloc分配的内存地址\n");
        for (int i = 0; i < 10; i++)
        {
            printf("%p\n", p+i);
        }
    }   

//第一种情况:直接在当前数组后面拓展内存空间
    int *p1 = (int *)realloc(p, 80);//变长
    if (p1 != NULL)
    {
        printf("realloc分配的内存地址%p\n",p1);
    }                   

//第二种情况:分配新的长度---->拷贝原来的内存---->释放原来的内存
    int *p2 = (int *)realloc(p, 100000);//变长
    if(p2!= NULL)
    {
        printf("realloc分配的内存地址%d\n",p2);
    }

    system("pause");
}

3.接口定义

#include<stdio.h>
#include<stdlib.h>
typedef struct array
{
    int *pArray;//指针保存数组的起始点
    int length;//保存数组的长度
    int state;//0代表无序,1代表有序从小到大,2有序从大到小
    int real_length;//实际分配的内存长度
}MyArray;
struct QueryResult
{
    int **pp;
    int count;
};
void  init(MyArray* p);//初始化
void  reinit(MyArray* p);//使用之后重新初始化
void  add_element(MyArray* p, int num);//增加一个元素
void  add_elements(MyArray* p, int *pArray, int n);//增加一个数组
void  print_all(MyArray* p);//打印所有的数据
int  * find_data(MyArray* p, int num);//返回第一个找到数据的地址
void  sort(MyArray* p);
void  modify(MyArray* p, int oldnum, int newnum);//实现修改
void  delete_one(MyArray* p, int num);//删除第一个找到的数据
void  delete_all(MyArray* p, int num); //删除所有能找到的数据
struct QueryResult find_all(MyArray* p, int num);//返回一片内存,包含所有找到的元素的首地址
void  insert_element(MyArray* p, int num, int insertnum, int isFront);//数据插入,1代表前面插入,0代表后面插入

注:实现部分考虑到版权问题,省略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值