#include<stdio.h>
#include<malloc.h> //包含malloc函数
#include<stdlib.h> //包含exit函数
/*定义一个数据类型,该数据类型的名字叫做struct Array,该数据类型含有三个成员,分别是 pBase , len , cnt*/
struct Array {
/*ArrayList实现的组成元素*/
int* pBase; //存储数组第一个元素的地址
int len; //数组所能容纳的最大的元素个数
int cnt; //当前数组的有效元素个数
//int increment; //增长因子
/*
增长因子存在的优缺点:
优点:当数组储存满了之后,如果每增加一个元素就向操作系统申请一次的话,这样很影响效率。
增长因子的作用就是在数组满了之后,以一定的数值对内存进行扩充,减少了向操作系统进行申请的次数。
缺点:额外消耗内存,可能申请之后部分内存没用到。
*/
};
/*ArrayList方法的实现*/
void init_Array(struct Array* parray , int length); //初始化
bool append_Array(struct Array* parray , int var); //追加元素,将var追加到数组里面
bool insert_Array(struct Array* parray, int pos , int var); //插入元素,pos的值从1开始
bool delete_Array(struct Array* parray, int pos, int* pvar); //删除元素,获取并删除第pos个元素
int get(); //获取某个元素的地址
bool isEmpty(struct Array parray); //判断是否为空
bool isFull(struct Array* parray); //判断是否满
void sort_Array(struct Array * parray); //排序
void show_Array(struct Array * parray); //输出
void inversion_Array(struct Array *parray); //倒置
int main() {
int var;
struct Array array; //定义变量,分配内存
init_Array(&array , 6); //分配内存之后,初始化变量,清楚地址中的垃圾值,指向有效数组
append_Array(&array, 1);
append_Array(&array, 2);
append_Array(&array, 3);
append_Array(&array, 4);
show_Array(&array);
inversion_Array(&array);
show_Array(&array);
if (delete_Array(&array,1, &var)) {
printf("删除成功,你删除的元素是 %d\n", var);
}
else {
printf("删除失败!\n");
}
/*append_Array(&array, 1);
append_Array(&array, 2);
append_Array(&array, 3);
append_Array(&array, 4);
append_Array(&array, 5);
insert_Array(&array,7, 99);
append_Array(&array, 6);
//数据存满,追加失败
append_Array(&array, 7);
if (append_Array(&array, 7)) {
printf("追加成功\n" );
}
else {
printf("追加失败!\n");
}*/
show_Array(&array);
return 0;
}
void init_Array(struct Array* parray , int length) {
//main函数调用此函数时,(&array)将array的首地址赋给(变量类型的struct Array*)parray,
//此时*parray等价于array,可通过调用函数初始化修改array变量的值
//(*parray).pBase
parray->pBase = (int *)malloc(sizeof(int) * length); //相当于指针变量parray指向结构体中的pBase成员
if (parray->pBase == NULL) {
printf("动态内存分配失败!\n");
exit(-1); //终止整个程序,包含于头文件stdlib.h
}
else {
parray->len = length;
parray->cnt = 0;
}
return;
}
bool isEmpty(struct Array* parray) {
if (parray->cnt == 0)
return true;
else
return false;
}
bool isFull(struct Array* parray) {
if (parray->cnt == parray->len)
return true;
else
return false;
}
void show_Array(struct Array * parray) {
/*
if(数组为空)
提示用户数组为空
else
对数组进行遍历操作
*/
if (isEmpty(parray)) { //parray本身就是一个struct Array*类型的变量,本身就是一个array的地址
printf("数组为空。\n");
}
else {
for (int i = 0; i < parray->cnt; i++) {
printf("%d\t", parray->pBase[i]);
}
printf("\n");
}
}
bool append_Array(struct Array* parray , int var) {
if (isFull(parray)) {
return false;
}
else {
//追加元素
parray->pBase[parray->cnt] = var;
(parray->cnt)++;
return true;
}
}
bool insert_Array(struct Array* parray, int pos, int var) {
int i;
if (isFull(parray)) {
return false;
}
if (pos < 1 || pos > parray->cnt+1) {
return false;
}
for (i = parray->cnt - 1; i < pos - 1; i ++ ) {
parray->pBase[i + 1] = parray->pBase[i]; //将下标pos-1之后的全部元素往后移动,从末尾开始移动,防止覆盖
}
parray->pBase[pos - 1] = var; //移动完成之后,pos减一的位置空出,将数据存入
(parray->cnt)++;
}
bool delete_Array(struct Array* parray, int pos, int* pvar){
int i;
if (isEmpty(parray)) {
return false;
}
if (pos < 1 || pos > parray->cnt) {
return false;
}
//先获取要删除的数据
*pvar = parray->pBase[pos - 1]; //*pval 等价于main函数中的var
for (i = pos ; i < parray->cnt; i++) {
parray->pBase[i - 1] = parray->pBase[i]; //将数据前移,往前覆盖
}
(parray->cnt) --;
return true;
}
void inversion_Array(struct Array *parray) {
int i = 0;
int j = parray->cnt - 1;
int t;
while (i < j) {
t = parray->pBase[i];
parray->pBase[i] = parray->pBase[j];
parray->pBase[j] = t;
i++;
j--;
}
return;
}
void sort_Array(struct Array * parray) {
}
c语言数组实现ArrayList部分函数
最新推荐文章于 2023-09-13 19:14:40 发布