一、什么叫数组
1、数组
元素类型相同,大小相等
// 数组写法:
int a[10];
int *pArr = (int *)malloc(sizeof(int) * len);
2、确定一个数组,需要几个参数?
3个:第一个元素的地址;数组的长度;有效元素的个数。
二、用数组实现一个类ArrayList(数组中常用操作的实现)
// Arr.c
#include <stdio.h>
#include <malloc.h> // 包含了malloc函数
#include <stdlib.h> // 包含了exit函数
#include <stdbool.h> // 包含了bool类型
struct Arr
{
int *pBase; // 存储的是数组第一个元素的地址
int len; // 数组所能容纳的最大元素的个数
int cnt; // 当前数组有效元素的个数
// int increment; // 自动增长因子(数组按照这个因子来扩充空间)
// allocate();动态内存的扩充
};
// 定义了一个数据类型,名字叫struct Arr,含有3个成员,分别是pBase、len和cnt。
// 并没有定义变量,因此并没有分配内存。
void init_arr(struct Arr *pArr, int length); // 初始化
bool append_arr(struct Arr *pArr, int val); // 追加
bool insert_arr(struct Arr *pArr, int pos, int val); // 添加。pos的值从1开始
bool delete_arr(struct Arr *pArr, int pos, int *pVal); // 删除
// 返回删除成功与失败;返回删除的值
int get(); // 获得某个下标处的值
bool is_empty(struct Arr *pArr);
bool is_full();
void sort_arr(); // 排序
void show_arr(struct Arr *pArr); // 显示输出
void inverse_arr(); // 倒置
int main()
{
struct Arr arr; // 定义了一个变量,则分配了内存
// 但因为只定义没有进行初始化,因此pBase、len、cnt里面都保存的是垃圾数字
// 初始化可以让变量的成员保存的不再是垃圾数字,而是有意义的值
int val = 0; // 用于接收删除的值
init_arr(&arr, 6);
show_arr(&arr);
append_arr(&arr, 1);
append_arr(&arr, 2);
append_arr(&arr, 3);
append_arr(&arr, 4);
append_arr(&arr, 5);
// append_arr(&arr, 6);
// append_arr(&arr, 7); // 数组只可以插入6个,因此追加不进去了
show_arr(&arr);
insert_arr(&arr, 1, 99);
show_arr(&arr);
delete_arr(&arr, 1, &val);
return 0;
}
void init_arr(struct Arr *pArr, int length)
{
(*pArr).len = 99;
pArr->pBase = (int *)malloc(sizeof(int) * length); // pArr指针变量指向的结构体变量中的pBase成员
if(NULL == pArr->pBase) // malloc分配不成功时,会把NULL赋给pBase
{
printf("动态分配内存失败!\n");
exit(-1); // 终止整个程序
}
else
{
pArr->len = length;
pArr->cnt = 0;
}
return;
}
void show_arr(struct Arr *pArr)
{
/* if(数组为空)
提示用户数组为空
else
显示数组有效内容 */
if(is_empty(pArr))
{
printf("数组为空!\n");
}
else
{
int i = 0;
for(i = 0; i < pArr->cnt; ++i)
{
printf("%d", pArr->pBase[i]);
}
}
}
bool is_empty(struct Arr *pArr)
{
if(0 == pArr->cnt)
{
return true;
}
else
{
return false;
}
}
bool is_full(struct Arr *pArr)
{
if(pArr->cnt == pArr->len)
return true;
else
return false;
}
bool append_arr(struct Arr *arr, int val)
{
if(is_full(pArr))
return false;
else
{
pArr->pBase[pArr->cnt] = val;
(pArr->cnt)++;
return true;
}
}
bool insert_arr(struct Arr *pArr, int pos, int val)
{
int i = 0;
if(is_full(pArr))
return false;
if(pos <1 || pos > pArr->cnt+1)
return false;
for(i = pArr->cnt-1; i >= pos-1; i--)
{
pArr->pBase[i+1] = pArr->pBase[i];
}
pArr->pBase[pos-1] = val;
(pArr->cnt)++;
return true;
}
bool delete_arr(struct Arr *pArr, int pos, int *pVal)
{
int i = 0;
if(is_empty(pArr))
return false;
if(pos < 1 || pos>pArr->cnt)
return false;
*pVal = pArr->pBase[pos-1];
for(i = pos; i<pArr->cnt; i++)
{
pArr->pBase[i-1] = pArr->pBase[i];
}
}