各类资料学习下载合集
https://pan.quark.cn/s/8c91ccb5a474
在前面的系列文章中,我们已经成功地从零构建了一个通用的动态数组,并为其赋予了初始化、插入和自动扩容的“超能力”。现在,我们的“魔法盒子”能进能出,能屈能伸。
今天,我们将完成这趟旅程的最后一站——为动态数组添加优雅的删除功能。我们将实现两种最常见的删除方式:
- 1. 按位置删除:像外科手术一样精确移除指定索引的元素。
- 2. 按值删除:像侦探一样在数组中找到目标,并将其移除。
准备好了吗?让我们开始为我们的动态数组安装上最后的“精密部件”!
一、 前情回顾:动态数组的当前状态
我们的 DynamicArray.h
头文件已经包含了初始化、插入和遍历的接口。现在,我们将在其中加入删除函数的声明。
DynamicArray.h
#ifndef DYNAMIC_ARRAY_H
#define DYNAMIC_ARRAY_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
void** pAddr;
int m_capacity;
int m_size;
} DynamicArray;
// --- 已有函数 ---
DynamicArray* init_DynamicArray(int capacity);
void insert_DynamicArray(DynamicArray* arr, int pos, void* data);
void foreach_DynamicArray(DynamicArray* arr, void (*printCallback)(void*));
void destroy_DynamicArray(DynamicArray* arr);
// --- 本次新增的函数声明 ---
// 1. 按位置删除
void removeByPos_DynamicArray(DynamicArray* arr, int pos);
// 2. 按值删除
void removeByValue_DynamicArray(DynamicArray* arr, void* data, int (*compareCallback)(void*, void*));
#endif
二、 精准打击:实现按位置删除 removeByPos_DynamicArray
按位置删除的逻辑与插入恰好相反。插入是把元素“挤进去”,需要把后面的元素向后挪;而删除则是把元素“拿出来”,需要把后面的元素向前挪来填补空缺。
这个过程就像排队时,中间有个人走了,他后面所有人都需要向前迈一步。