C语言版ArrayList动态扩容数组

使用C实现类似Java ArrayList动态扩容数组

实现代码

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>

typedef struct _array
{
	int size; //array大小
	int key;  //最在元素key
	int *pElements;
} arrayList;


void init(arrayList *pArr, int size);
void resize(arrayList *pArr);
void toString(arrayList *pArr);
bool empty(arrayList *pArr);
bool full(arrayList *pArr);
bool append(arrayList *pArr, int val);
bool insert(arrayList *pArr, int index, int val);
bool del(arrayList *pArr, int index);
void reversion(arrayList *pArr);
void sort(arrayList *pArr);

int main(void)
{
	arrayList arr;
	init(&arr, 1);
	printf("init");
	toString(&arr);
	int i = 0;
	for (; i < 10; i++)
	{
		append(&arr, i);
	}
	
	toString(&arr);

	insert(&arr, 1, 22);
	printf("insert:1,22");
	toString(&arr);

	insert(&arr, 3, 55);
	printf("insert:3,55");
	toString(&arr);

	del(&arr, 2);
	printf("del:2");
	toString(&arr);

	reversion(&arr);
	printf("reversion");
	toString(&arr);

	sort(&arr);
	printf("sort");
	toString(&arr);

	
	return 0;
}


void init(arrayList *pArr, int size){
	pArr->pElements = (int *)malloc(sizeof(int)* size);
	pArr->key = 0;
	pArr->size = size;
}

bool append(arrayList *pArr, int val){
	if (full(pArr)) {
		resize(pArr);
	}
	pArr->pElements[pArr->key] = val;
	pArr->key++;
	return true;
}

//动态扩容
void resize(arrayList *pArr)
{
	if (pArr->key >= pArr->size)
	{
		int *newArr;
		int oldSize = (pArr->size == 1) ? 2 : pArr->size;
		int newSize = ceil(oldSize + (oldSize >> 1)); //1.5倍
//		printf("%d \n", newSize);
		newArr = malloc(sizeof(newArr) * newSize);
		int i = 0;
		for (; i <= pArr->key; i++)
		{
			newArr[i] = pArr->pElements[i];
		}
		free(pArr->pElements);
		pArr->pElements = newArr;
		pArr->size = newSize;
	}
}

bool insert(arrayList *pArr, int index, int val){
	int i;
	if (full(pArr)) return false;
	
	for (i = pArr->key; i >index; --i)
	{
		pArr->pElements[i] = pArr->pElements[i-1];
	}
	pArr->pElements[index] = val;
	pArr->key++;
	return true;
}

bool del(arrayList *pArr, int index){
	int i;
	if (empty(pArr)) return false;
	
	for (i = index; i <pArr->key; ++i)
	{
		pArr->pElements[i] = pArr->pElements[i+1];
	}	
	pArr->key--;
	return true;
}

void reversion(arrayList *pArr){
	if (empty(pArr)) return;
	int i = 0;
	int j = pArr->key-1;
	int t;
	while (i < j)
	{
		t = pArr->pElements[i];
		pArr->pElements[i] = pArr->pElements[j];
		pArr->pElements[j] = t;
		++i;
		--j;
	}
}

void sort(arrayList *pArr){
	if (empty(pArr)) return;
	int i,j,t;

	for (i = 0; i < pArr->key; ++i)
	{
		for (j = i; j < pArr->key; ++j)
		{
			if (pArr->pElements[i] > pArr->pElements[j]){
				t = pArr->pElements[j];
				pArr->pElements[j] = pArr->pElements[i];
				pArr->pElements[i] = t;
			}
		}
	}
}

void toString(arrayList *pArr){
	int i;
	if (empty(pArr))
	{
		printf("[] \n");
		return;
	}
	printf("[");
	for (i = 0; i < pArr->key; i++)
	{
		printf("%d ,", pArr->pElements[i]);
	}
	printf("] \n");
	return;
}


bool empty(arrayList *pArr){
	if (pArr->key > 0) return false;
	else return true;
}

bool full(arrayList *pArr){
	if (pArr->key >= pArr->size)
		return true;
	else
		return false;
}

运行结果:

init[] 
[0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,] 
insert:1,22[0 ,22 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,] 
insert:3,55[0 ,22 ,1 ,55 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,] 
del:2[0 ,22 ,55 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,] 
reversion[9 ,8 ,7 ,6 ,5 ,4 ,3 ,2 ,55 ,22 ,0 ,] 
sort[0 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,22 ,55 ,] 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值