背景
- C 语言本身并不支持数组随计算发生变化,所以可以使用 malloc 创建新的空间,并让旧数组指向新空间的方式,实现变相的扩容。
- 由于 malloc 创建空间,是向后创建的,所以每次扩容时,都会在前面留下空白的空间,此时就造成了空间的浪费,此缺点可以利用链表进行弥补。
- 可以自定函数将可变数组的对应功能进行封装,方便使用。
- 本文中的具体实现参考了浙大翁恺老师的 C 语言课程,链接已在本文末尾给出,如果有地方看不懂可以自己去看视频了解或者私信我。
结构定义及相关函数声明(array.h)
#ifndef __ARRAY_H
#define __ARRAY_H
typedef struct Array {
int *array_;
int size_;
} Array;
Array array_Create(int size);
void array_Free(Array *array);
int array_Size(const Array *array);
int array_Check_Index(Array *array, int index);
int* array_At(Array *array, int index);
int array_Get(Array *array, int index);
void array_Set(Array *array, int index, int value);
void array_Inflate(Array *array, int more_size);
#endif
函数定义(array.c)
#include <stdlib.h>
#include <string.h>
#include "array.h"
#define BLOCK_SIZE 20
Array array_Create(int size) {
Array temp;
temp.array_ = (int*)malloc(sizeof(int) * size);
temp.size_ = size;
return temp;
}
void array_Free(Array *array) {
free(array -> array_);
array -> array_ = NULL;
array -> size_ = 0;
}
int array_Size(const Array *array) {
return array -> size_;
}
int array_Check_Index(Array *array, int index) {
if (index >= array -> size_) {
array_Inflate(array, (index / BLOCK_SIZE + 1) * BLOCK_SIZE - array -> size_);
} else if (index < 0) {
index = 0;
}
return index;
}
int* array_At(Array *array, int index) {
return &(array -> array_[array_Check_Index(array, index)]);
}
int array_Get(Array *array, int index) {
return array -> array_[array_Check_Index(array, index)];
}
void array_Set(Array *array, int index, int value) {
array -> array_[array_Check_Index(array, index)] = value;
}
void array_Inflate(Array *array, int more_size) {
array -> size_ = array -> size_ + more_size;
int *new_array = (int*)malloc(sizeof(int) * array -> size_);
memcpy(new_array, array -> array_, sizeof(int) * (array -> size_ - more_size));
free(array -> array_);
array -> array_ = new_array;
}
测试(main.c)
#include <stdio.h>
#include "array.h"
int main(int argc, char *argv[]) {
Array array = array_Create(2);
printf("当前可变数组的空间为:%d\n", array_Size(&array));
int cut = 0;
while (1) {
scanf("%d", array_At(&array, cut++));
if (array_Get(&array, cut - 1) == -1) {
break;
}
}
printf("当前可变数组的空间为:%d\n", array_Size(&array));
for (int i = 0; i < array_Size(&array); i++) {
if (array_Get(&array, i) == -1) {
break;
}
printf("%d ", array_Get(&array, i));
}
printf("\n");
system("pause");
return 0;
}
参考资料
C 语言程序设计进阶-翁恺