使用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 ,]