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.
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代表后面插入
注:实现部分考虑到版权问题,省略。