动态数组

   

    在数据结构当中,除了链表和树的结构之外,一个重要的角色就是动态数组。它与链表不一样的地方就是内存的分配方式。创建一个链表的时候,在内存方面,是不连续分配的,而动态数组就不一样,它就要求连续分配。而两者的大概功能可以说大同小异吧。它的出现可以就是为了节省内存的使用,进行实时的修改内存的使用,避免冗余。但是如果过于频繁的使用,我个人觉得并不是一件什么好的事。

    接触过JAVA的人,对vector这个结构的相关接口应该算是比较了解的,它就是动态数组。以前自己在大学的时候用JSP写过一个简单的聊天室,对于进入聊天室的用户人数进行实时的监控就采用了vector这个结构。

1、定义接口:

  1. #ifndef   _VECTOR_H
  2. # define   _VECTOR_H


  3. typedef   void* value_type;
  4. typedef   struct   _Vector   Vector;



  5. typedef    void (*VectorDestroyFunc)(value_type   data,  void*      ctx);
  6. typedef    void   (*VectorForeachFunc)(value_type   data,  void* ctx);


  7. typedef   enum   _Ret
  8. {
  9.         RET_FALSE,
  10.         RET_TRUE
  11. } Ret;


  12. Vector*   vector_create(VectorDestroyFunc   destroy_func);
  13. value_type  vector_index_get(Vector*  thiz,  size_t  index);
  14. Ret              vector_append(Vector* thiz, value_type    data);
  15. Ret              vector_index_insert(Vector* thiz, value_type  data, size_t   index);
  16. Ret              vector_index_delete(Vector*  thiz, size_t   index);
  17. Ret              vector_destroy(Vector*  thiz);
  18. void         vector_foreach(Vector* thiz, VectorvectorForeachFunc   foreach_func,  void*   ctx);


  19. #endif

2、接口的具体实现:

  1.   define    ADD_SIZE     100



  2.  struct   _Vector
  3. {
  4.       value_type*   data;
  5.       size_t   used_size;
  6.       size_t    total_size;
  7.       VectorDestroyFunc    destroy_func;
  8. };


  9.  Vector*   vector_create(VectorDestroyFunc   destroy_func)
  10. {
  11.        Vector*   thiz =  (Vector*)malloc(sizeof(Vector));

  12.         thiz->data =  NULL;
  13.         thiz->used_size = 0;
  14.         thiz->total_size = 0;
  15.         thiz->destroy_func = destroy_func;



  16.         return thiz;
  17. }


  18.  value_type  vector_get_index(Vector*  thiz,  size_t index)
  19. {
  20.         assert(thiz != NULL   &&  index < thiz->total_size);;
  21.         
  22.        return   thiz->data[index];     
  23. }



  24.  static  Ret vector_set_memory(Vector*  thiz)
  25. {
  26.         thiz->total_size = thiz->total_size  +  ADD_SIZE;
  27.          thiz->data =  (value_type*)alloc(thiz->data, thiz->total_size * sizeof(value_type));


  28.          return RET_TRUE;
  29. }



  30.  Ret  vector_append(Vector*  thiz, value_type  data)
  31. {
  32.           assert(thiz != NULL);

  33.           if(thiz->used_size + 1 > thiz->total_size)
  34.          {
  35.                  if(vector_set_memory(thiz) != RET_TRUE)
  36.                         return RET_FALSE;
  37.          }
  38.           
  39.           thiz->data[used_size] = data;
  40.           thiz->total_size ++;
  41.           thiz->used_size ++;
  42.           
  43.         return RET_TRUE;
  44. }

  45. Ret              vector_index_insert(Vector* thiz, value_type  data, size_t   index);
  46. Ret              vector_index_delete(Vector*  thiz, size_t   index);
  47. Ret              vector_destroy(Vector*  thiz);




 3、实现一下遍历函数:
  1. void   vector_foreach(Vector*  thiz, VectorForeachFunc  foreach_func,  void* ctx)
  2. {
  3.         assert(thiz  != NULL);
  4.        
  5.         size_t  index = 0;
  6.          while(thiz->used_size  == index)
  7.          {
  8.                   foreach_func(thiz->data[index], ctx);
  9.                   index++;
  10.           }
  11.  
  12.          return ;
  13. }
       无论是链表还是数组实现遍历函数的目的就是为了打印出每个数组元素的值,因为数组元素里面可以保存数据,也可以保存地址。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值