一个固定大小的数组,不断添加元素,当填满数组时,删除旧数据,保留新数据。
#include <stdio.h>
#define MAX_SIZE 5
// 打印数组元素
void print_arr(int arr[], int num) {
for (int i = 0; i < num; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[MAX_SIZE] = {0};
int length = 0; // 用于跟踪已赋值元素的个数
// 模拟添加数据
for (int i = 10; i <= 100; i += 10) {
if (length < MAX_SIZE) {
arr[length++] = i;
} else {
// 将所有元素向前移动一位
for (int j = 0; j < MAX_SIZE - 1; ++j) {
arr[j] = arr[j + 1];
}
// 在数组末尾添加新元素
arr[MAX_SIZE - 1] = i;
}
print_arr(arr, length);
}
return 0;
}
当数组满时,每添加一个元素,都要把所有元素向前移动一位,性能实在太差了。
解决思路:当数组满时,保留最后3个,这样只有等下次数组满时才会移动所有元素。
#include <stdio.h>
#define ARRAY_SIZE 5
#define MAX_SIZE 3
// 打印数组元素
void print_arr(int arr[], int num) {
for (int i = 0; i < num; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[ARRAY_SIZE] = {0};
int length = 0; // 用于跟踪已赋值元素的个数
// 模拟添加数据
for (int i = 10; i <= 100; i += 10) {
arr[length++] = i;
print_arr(arr, length);
// 最后一个数组arr[4],赋值完成后length=5,数组满了
if (length >= ARRAY_SIZE) {
puts("move");
int start_index = length - MAX_SIZE; // 开始移动的位置 5-3=2 也就是倒数第3个的位置
for (int j = 0; j < MAX_SIZE; ++j) {
arr[j] = arr[start_index + j]; // 前3个元素替换为原最后3个元素
}
length = MAX_SIZE; // 现在索引位置是2,下次索引从3开始,也就是MAX_SIZE
}
}
return 0;
}