今晚把之前的动态数组敲了一遍,感觉还是有点生疏啊,都忘记的差不多了,开辟一个void **data的动态数组,里面存的是void *,这样也实现了通用性,然后呢里面用到了函数指针,写了接口,用户可以自己写,比如void (*free)(void *ptr),还有迭代器,可以遍历任何东西,今晚先用迭代器遍历这个动态数组,为了方便,我全部用存成整数,简单方便。
其实,这个里面呢,还有一个好的小技巧,如何按照一定数进行扩容,比如,我给31,10,15你要给我变为32,而我给我33,56你要给我变为64,也就是变为32的整数倍。
#define MODE_SIZE 32
static int adjust_size(int size)
{
size += (MODE_SIZE - 1);
size /= MODE_SIZE;
size *= MODE_SIZE;
return size;
}
还有static我也说过,定义的函数只是为了在本文件使用。迭代器里面也要学会#define宏定义定义函数。
dynamic_array.h的声明
#ifndef _ARRAY_H_
#define _ARRAY_H_
//防止头文件出现重复的包含
#include "iterator.h"
#define TRUE (1)
#define FALSE (0)
#define MODE_SIZE (32)
#define ZERO (0)
typedef unsigned char Boolean;
typedef struct Array Array;
//定义动态数组的结构体
struct Array{
void **data ; // 1.存储实体
int capacity; // 2.动态数组的申请大小
int count ; // 3.当前元素个数
//4.拷贝函数指针
void *(*copy)(void *src_value);
//5.匹配函数指针
Boolean (*match)(void *value1, void *value2);
//6.释放函数指针
void (*free)(void *ptr);
//7.头部插入
Boolean (*push_front)(Array *array, void *value);
//8.尾部插入
Boolean (*push_back)(Array *array, void *value);
//9.头部删除
Boolean (*pop_front)(Array *array);
//10.尾部删除
Boolean (*pop_back)(Array *array);
//迭代器操作
//11.指向数组头部的位置
void *(*iter_head)(Iterator *iter, Array *array);
//12.指向数组尾部的位置
void *(*iter_tail)(Iterator *iter, Array *array);
//13.指向后一个元素的位置
void *(*iter_next)(Iterator *iter, Array *array);
//14.指向前一个元素的位置
void *(*iter_prev)(Iterator *iter, Array *array);
};
//动态数组操作接口
Array *init_array(int init_size) ; //动态数组的初始化
void destroy_array(Array **array); //动态数组的销毁
void array_clean(Array *array) ; //动态数组清空
//插入到指定下标的前边
Boolean array_prev_insert(Array *array,
int index, void *value);
//插入到指定下标的后边
Boolean array_next_insert(Array *array,
int index, void *value);
int get_array_count(Array *array) ; //得到动态数组的个数
void *get_array_index(Array *array, int index) ; //得到指定下标的元素
Boolean delete_index_value(Array *array, int index); //删除指定下标元素
Boolean delete_range_value(Array *array,
int begin, int end) ; //删除指定下标范围的元素
int find_value(Array *array, void *value) ; //查找指定元素的下标
#endif
dynamic_array.h的实现