动态数组的实现 及 迭代器

本文回顾了动态数组的实现,采用void **data存储void *指针实现通用性。讨论了利用函数指针实现用户自定义释放功能,并引入迭代器遍历动态数组,目前数组内元素为整数。文章提到了动态扩容策略,如按32的整数倍扩容,并简要介绍了动态数组和迭代器的相关头文件及工具函数。
摘要由CSDN通过智能技术生成

            今晚把之前的动态数组敲了一遍,感觉还是有点生疏啊,都忘记的差不多了,开辟一个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的实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值