各类资料学习下载合集
https://pan.quark.cn/s/8c91ccb5a474
在上一篇博客中,我们成功地为动态数组搭建了“骨架”——设计了结构体并实现了初始化函数。现在,我们的“魔法盒子”已经诞生,但它还是空的。是时候给它注入灵魂,让它能够真正地存放和管理数据了!
今天,我们将聚焦于动态数组最核心的功能:向指定位置插入元素。更酷的是,我们将实现它的“杀手级特性”——当盒子满了之后,它能自动变大!
一、 前情回顾:我们的动态数组结构
在开始之前,让我们回顾一下 DynamicArray.h
中定义的结构体和已有的函数:
// DynamicArray.h
#ifndef DYNAMIC_ARRAY_H
#define DYNAMIC_ARRAY_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 我们使用的是通用指针 void*,所以数组类型是 void**
typedef struct {
void** pAddr; // 指向真实数据存储区的指针 (数组的元素是 void*)
int m_capacity; // 容量
int m_size; // 当前大小
} DynamicArray;
// 初始化
DynamicArray* init_DynamicArray(int capacity);
// 销毁
void destroy_DynamicArray(DynamicArray* arr);
// --- 本次新增的函数声明 ---
// 插入
void insert_DynamicArray(DynamicArray* arr, int pos, void* data);
// 遍历
void foreach_DynamicArray(DynamicArray* arr, void (*printCallback)(void*));
#endif
注意,为了通用性,我们将之前 int* pAddr
升级为了 void** pAddr
,这样我们的数组就可以存放任何类型的指针了。
二、 核心功能:实现插入函数 insert_DynamicArray
插入操作就像在一排坐满人的椅子中间加一个人。你需要:
- 找到要插入的位置。
- 让这个位置及之后的所有人,都向后挪一个座位。
- 让新来的人坐到空出的位置上。
但在此之前,我们还得考虑一个重要问题:如果整排椅子都满了怎么办?答案是:换一排更长的椅子! 这就是自动扩容。
下面是 insert_DynamicArray
函数的完整实现,我们一步步来解析:
Dynam