C语言连续储存-数组
这个使用指针和结构体来模拟数组的存储,并实现java中ArrayList的部分功能。
struct Arr{
int *pBase; //存储的是数组第一个元素的地址
int len; //数组所能容纳的最大元素的个数
int cnt; //当前数组有效元素的个数
};
完成10个功能,几乎所有的函数都必须传入结构体类型的指针变量,在后面就不特别说明了。
void init_arr(struct Arr * pArr,int length); //1.初始化数组
bool append_arr(struct Arr * pArr,int value); //2.在数组末尾追加一个元素
bool insert_arr(struct Arr * pArr,int pos, int value);//3.插入一个元素
bool delete_arr(struct Arr * pArr,int pos,int * pVal);//4.删除一个元素
int get(struct Arr * pArr); //5.获取当前元素
bool is_empty(struct Arr * pArr); //6.判断数组是否为空
bool is_full(struct Arr * pArr); //7.判断数组是否满
void sort_arr(); //8.对数组进行排序
void show_arr(struct Arr * pArr); //9.遍历输出数组
void insersion_arr(struct Arr * pArr); //10.数组的反转
-
初始化数组,需传入参数为结构体中的
struct Arr *
类型的指针变量、数组的最大存储个数。void init_arr(struct Arr * pArr,int length){ // 1 pArr->pBase = (int *)malloc(sizeof(int) * length); if(NULL == pArr->pBase){ printf("动态内存你分配失败!!"); exit(0); //程序终止,要调用exit(0);函数,需添加头文件:#include<stdlib.h> }else{ pArr->len = length; //数组元素最大个数 pArr->cnt = 0; //初始化元素个数,一开始是0个 printf("数组初始化成功!!\n"); } return; }
-
在数组末尾追加一个元素,需传入
value
,表示插入的值。bool append_arr(struct Arr * pArr,int value){ // 2 if(is_full(pArr)){ //如果数组满了,就不能插入 printf("\n数组满了,添加失败"); return false; }else{ pArr->pBase[pArr->cnt] = value; pArr->cnt++; //插入一个数后,数组当前有效个数加1 printf("\n添加成功 %d",value); return true; } }
-
在特定位置添加一个数,需传入
pos
和value
,分别代表插入的位置和插入的值。pos
从1开始,如数组a[6] = {1,2,3,4,5};在pos=2
处插入8,即得a[6] = {1,8,2,3,4,5};且若是数组满了,则不能插入;若数组只有i(0<i<=cnt)个数时,当传入的
pos>i
时,则默认在数组当前值后面一位插入值。bool insert_arr(struct Arr * pArr,int pos, int value){ // 3 if(pos>pArr->cnt+1 || pos<1){ printf("\npos 的值不合法"); return false; } if(is_full(pArr)){ printf("\n数组满了,不能再添加值了"); return false; } int i; if(pArr->cnt >= pos){ for(i = pArr->cnt-1; i >= pos-1;i--){ pArr->pBase[i+1] = pArr->pBase[i]; } pArr->pBase[pos-1] = value; printf("\n插入成功 %d",value); pArr->cnt++; return true; }else{ pArr->pBase[pArr->cnt] = value; printf("\n插入成功 %d",value); pArr->cnt++; return true; } }
-
删除一个数,需传入
pos
和一个int *
类型的指针变量(有时需要得到删除的数)。bool delete_arr(struct Arr * pArr,int pos,int * pVal){ // 4 if(is_empty(pArr)){ printf("\n数组为空,无可删除"); return false; } if(pos>pArr->cnt || pos<1){ printf("\npos 的值不合法"); return false; } int i; *pVal = pArr->pBase[pos-1]; //先获取要删除的数 for(i = pos;i<=pArr->cnt-1;i++){ pArr->pBase[i-1] = pArr->pBase[i]; } pArr->cnt--; printf("\n删除成功 %d",*pVal); return true; }
-
得到当前元素
int get(struct Arr * pArr){ // 5 return pArr->pBase[pArr->cnt-1]; }
-
判断数组是否为空
bool is_empty(struct Arr * pArr){ // 6 if(pArr->cnt == 0) return true; else return false; }
-
判断数组是否满
bool is_full(struct Arr * pArr){ // 7 if(pArr->cnt == pArr->len) return true; else return false; }
-
数组的排序,略。
-
输出数组。
void show_arr(struct Arr * pArr){ // 9 int i; if(is_empty(pArr)){ printf("数组为空!!"); return; }else{ printf("\n\n数组内容为\n"); for(i = 0;i < pArr->cnt;i++){ printf("%-6d",pArr->pBase[i]); } printf("\n"); return; } }
-
数组的反转。
void insersion_arr(struct Arr * pArr){ // 10 if(is_empty(pArr)){ printf("数组为空!!"); return; } int t; int i = 0; int j = pArr->cnt-1; while(i<j){ t = pArr->pBase[i]; pArr->pBase[i] = pArr->pBase[j]; pArr->pBase[j] = t; i++; j--; } return; }
main()函数调用调试以上功能
int main(){
struct Arr arr;
int val;
init_arr(&arr,6); //初始化数组
append_arr(&arr,1); //添加三个数
append_arr(&arr,2);
append_arr(&arr,3);
insert_arr(&arr,1,30); //在 1 处插入一个数
delete_arr(&arr,3,&val);//在 3 处删除一个数
show_arr(&arr); //遍历输出数组
insersion_arr(&arr); //反转数组
show_arr(&arr);
printf("当前数组的值为 %d",get(&arr));
return 0;
}
源自:郝斌老师数据结构自学视频
注:学习笔记