数组的封装

来源:互联网 发布:solidworks软件自学网 编辑:程序博客网 时间:2024/05/09 23:03

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代表后面插入

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

0 0