1、定义ArrayList 结构体类型
#include <stdio.h>
#include <stdlib.h>
// 定义 ArrayList 结构体
typedef struct {
int* data; // 数组指针
int size; // 当前元素个数
int capacity; // 分配的数组空间大小
} ArrayList;
2、创建指定初始容量的 ArrayList
ArrayList* createArrayList(int capacity) {
ArrayList* list = (ArrayList*)malloc(sizeof(ArrayList));
list->data = (int*)malloc(capacity * sizeof(int));
list->size = 0;
list->capacity = capacity;
return list;
}
3、向 ArrayList 的末尾添加元素
void add(ArrayList* list, int value) {
if (list->size == list->capacity) {
// 如果当前元素个数等于数组空间大小,则需要扩容
list->data = (int*)realloc(list->data, list->capacity * 2 * sizeof(int));
list->capacity *= 2;
}
list->data[list->size++] = value;
}
4、获取指定位置的元素
int get(ArrayList* list, int index) {
if (index < 0 || index >= list->size) {
printf("Index out of bounds\n");
exit(1);
}
return list->data[index];
}
5、修改指定位置的元素的值
void set(ArrayList* list, int index, int value) {
if (index < 0 || index >= list->size) {
printf("Index out of bounds\n");
exit(1);
}
list->data[index] = value;
}
6、删除指定位置的元素
void removeAt(ArrayList* list, int index) {
if (index < 0 || index >= list->size) {
printf("Index out of bounds\n");
exit(1);
}
for (int i = index; i < list->size - 1; i++) {
list->data[i] = list->data[i + 1];
}
list->size--;
// 如果当前元素个数小于数组空间大小的 1/4,则缩小数组空间大小
if (list->size < list->capacity / 4) {
list->data = (int*)realloc(list->data, list->capacity / 2 * sizeof(int));
list->capacity /= 2;
}
}
7、销毁 ArrayList
void destroyArrayList(ArrayList* list) {
free(list->data);
free(list);
}
8、main方法测试
int main() {
ArrayList* list = createArrayList(10);
add(list, 1);
add(list, 2);
add(list, 3);
add(list, 4);
add(list, 5);
printf("Element at index 0: %d\n", get(list, 0));
printf("Element at index 3: %d\n", get(list, 3));
set(list, 1, 10);
printf("Element at index 1 after setting: %d\n", get(list, 1));
removeAt(list, 2);
printf("Element at index 2 after removing: %d\n", get(list, 2));
destroyArrayList(list);
return 0;
}
以上 ArrayList 实现了动态数组的功能。在 createArrayList 函数中,我们通过 malloc 函数分配了一个数组的空间,size 表示当前元素个数,capacity 表示分配的数组空间大小。
add 函数用于向 ArrayList 的末尾添加元素,如果当前元素个数等于数组空间大小,则需要扩容。get 函数用于获取指定位置的元素的值,set 函数用于修改指定位置的元素的值,removeAt 函数用于删除指定位置的元素,如果当前元素个数小于数组空间大小的 1/4,则需要进行缩小空间。
destroyArrayList 函数用于销毁 ArrayList 的内存。在 main 函数中我们可以看到如何使用这个 ArrayList 来添加、获取、修改和删除元素的方式。
运行截图: