c语言数组实现ArrayList部分函数

这篇博客展示了如何使用C语言实现ArrayList,包括初始化、追加、插入、删除、倒置和显示数组元素等功能。通过动态内存分配和结构体管理数组,提供了一组基本操作以支持ArrayList的常用操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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) {

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值