C语言实现 vector

来源:互联网 发布:nba张伯伦场均数据 编辑:程序博客网 时间:2024/05/16 05:15

转自:http://blog.csdn.net/dengxu11/article/details/7311820

//cvector.h

  1. # ifndef __CVECTOR_H__  
  2. # define __CVECTOR_H__  
  3.   
  4. # include <stdio.h>    
  5. # include <stdlib.h>    
  6. # include <string.h>    
  7.   
  8. # define MIN_LEN 256  
  9. # define CVEFAILED  -1  
  10. # define CVESUCCESS  0  
  11. # define CVEPUSHBACK 1  
  12. # define CVEPOPBACK  2  
  13. # define CVEINSERT   3  
  14. # define CVERM       4  
  15. # define EXPANED_VAL 1  
  16. # define REDUSED_VAL 2  
  17.   
  18. typedef void *citerator;  
  19. typedef struct _cvector *cvector;  
  20.   
  21. # ifdef __cplusplus  
  22. extern "C" {  
  23. # endif  
  24.   
  25.     cvector   cvector_create   (const size_t size                           );  
  26.     void      cvector_destroy  (const cvector cv                            );  
  27.     size_t    cvector_length   (const cvector cv                            );  
  28.     int       cvector_pushback (const cvector cv, void *memb                );  
  29.     int       cvector_popback  (const cvector cv, void *memb                );  
  30.     size_t    cvector_iter_at  (const cvector cv, citerator iter            );  
  31.     int       cvector_iter_val (const cvector cv, citerator iter, void *memb);  
  32.     citerator cvector_begin    (const cvector cv                            );  
  33.     citerator cvector_end      (const cvector cv                            );  
  34.     citerator cvector_next     (const cvector cv, citerator iter            );  
  35.     int       cvector_val_at   (const cvector cv, size_t index, void *memb  );  
  36.     int       cvector_insert   (const cvector cv, citerator iter, void *memb);  
  37.     int       cvector_insert_at(const cvector cv, size_t index, void *memb  );  
  38.     int       cvector_rm       (const cvector cv, citerator iter            );  
  39.     int       cvector_rm_at    (const cvector cv, size_t index              );  
  40.   
  41.     /* for test  */  
  42.     void      cv_info          (const cvector cv                            );  
  43.     void      cv_print         (const cvector cv                            );  
  44.   
  45. # ifdef __cplusplus  
  46. }  
  47. # endif  
  48.   
  49. #endif /* EOF file cvector.h */  

//cvector.c

  1. #include "cvector.h"  
  2.   
  3. #ifndef __gnu_linux__  
  4. #define __func__ "unknown"  
  5. #define inline __forceinline  
  6. #endif  
  7.   
  8. # define CWARNING_ITER(cv, iter, file, func, line) \  
  9.     do {\  
  10.     if ((cvector_begin(cv) > iter) || (cvector_end(cv) <= iter)) {\  
  11.     fprintf(stderr, "var(" #iter ") warng out of range, "\  
  12.     "at file:%s func:%s line:%d!!\n", file, func, line);\  
  13.     return CVEFAILED;\  
  14.     }\  
  15.     } while (0)  
  16.   
  17. struct _cvector  
  18. {  
  19.     void *cv_pdata;  
  20.     size_t cv_len, cv_tot_len, cv_size;  
  21. };  
  22.   
  23. cvector cvector_create(const size_t size)  
  24. {  
  25.     cvector cv = (cvector)malloc(sizeof (struct _cvector));  
  26.   
  27.     if (!cv) return NULL;  
  28.   
  29.     cv->cv_pdata = malloc(MIN_LEN * size);  
  30.   
  31.     if (!cv->cv_pdata)  
  32.     {  
  33.         free(cv);  
  34.         return NULL;  
  35.     }  
  36.   
  37.     cv->cv_size = size;  
  38.     cv->cv_tot_len = MIN_LEN;  
  39.     cv->cv_len = 0;  
  40.   
  41.     return cv;  
  42. }    
  43.   
  44. void cvector_destroy(const cvector cv)    
  45. {    
  46.     free(cv->cv_pdata);    
  47.     free(cv);    
  48.     return;    
  49. }    
  50.   
  51. size_t cvector_length(const cvector cv)    
  52. {    
  53.     return cv->cv_len;    
  54. }    
  55.   
  56. int cvector_pushback(const cvector cv, void *memb)    
  57. {    
  58.     if (cv->cv_len >= cv->cv_tot_len)     
  59.     {    
  60.         void *pd_sav = cv->cv_pdata;    
  61.         cv->cv_tot_len <<= EXPANED_VAL;    
  62.         cv->cv_pdata = realloc(cv->cv_pdata, cv->cv_tot_len * cv->cv_size);    
  63.   
  64.         if (!cv->cv_pdata)     
  65.         {    
  66.             cv->cv_pdata = pd_sav;    
  67.             cv->cv_tot_len >>= EXPANED_VAL;    
  68.             return CVEPUSHBACK;    
  69.         }    
  70.     }    
  71.   
  72.     memcpy((char *)cv->cv_pdata + cv->cv_len * cv->cv_size, memb, cv->cv_size);    
  73.     cv->cv_len++;    
  74.   
  75.     return CVESUCCESS;    
  76. }    
  77.   
  78. int cvector_popback(const cvector cv, void *memb)    
  79. {    
  80.     if (cv->cv_len <= 0) return CVEPOPBACK;    
  81.   
  82.     cv->cv_len--;    
  83.     memcpy(memb, (char *)cv->cv_pdata + cv->cv_len * cv->cv_size, cv->cv_size);    
  84.   
  85.     if ((cv->cv_tot_len >= (MIN_LEN << REDUSED_VAL))     
  86.         && (cv->cv_len <= (cv->cv_tot_len >> REDUSED_VAL)))     
  87.     {    
  88.         void *pd_sav = cv->cv_pdata;    
  89.         cv->cv_tot_len >>= EXPANED_VAL;    
  90.         cv->cv_pdata = realloc(cv->cv_pdata, cv->cv_tot_len * cv->cv_size);    
  91.   
  92.         if (!cv->cv_pdata)     
  93.         {    
  94.             cv->cv_tot_len <<= EXPANED_VAL;    
  95.             cv->cv_pdata = pd_sav;    
  96.             return CVEPOPBACK;    
  97.         }    
  98.     }    
  99.   
  100.     return CVESUCCESS;    
  101. }    
  102.   
  103. size_t cvector_iter_at(const cvector cv, citerator iter)    
  104. {    
  105.     CWARNING_ITER(cv, iter, __FILE__, __func__, __LINE__);    
  106.     return ((char *)iter - (char *)cv->cv_pdata) / cv->cv_size;    
  107. }    
  108.   
  109. int cvector_iter_val(const cvector cv, citerator iter, void *memb)    
  110. {    
  111.     CWARNING_ITER(cv, iter, __FILE__, __func__, __LINE__);    
  112.     memcpy(memb, iter, cv->cv_size);    
  113.     return 0;    
  114. }    
  115.   
  116. citerator cvector_begin(const cvector cv)    
  117. {    
  118.     return cv->cv_pdata;    
  119. }    
  120.   
  121. citerator cvector_end(const cvector cv)    
  122. {    
  123.     return (char *)cv->cv_pdata + (cv->cv_size * cv->cv_len);    
  124. }    
  125.   
  126. static inline void cvmemove_foreward(const cvector cv, void *from, void *to)    
  127. {    
  128.     size_t size = cv->cv_size;    
  129.     char *p;    
  130.     for (p = (char *)to; p >= (char *)from; p -= size) memcpy(p + size, p, size);    
  131.     return;    
  132. }    
  133.   
  134. static inline void cvmemove_backward(const cvector cv, void *from, void *to)    
  135. {    
  136.     memcpy(from, (char *)from + cv->cv_size, (char *)to - (char *)from);    
  137.     return;    
  138. }    
  139.   
  140. int cvector_insert(const cvector cv, citerator iter, void *memb)    
  141. {    
  142.     CWARNING_ITER(cv, iter, __FILE__, __func__, __LINE__);    
  143.   
  144.     if (cv->cv_len >= cv->cv_tot_len)     
  145.     {    
  146.         void *pd_sav = cv->cv_pdata;    
  147.         cv->cv_tot_len <<= EXPANED_VAL;    
  148.         cv->cv_pdata = realloc(cv->cv_pdata, cv->cv_tot_len * cv->cv_size);    
  149.   
  150.         if (!cv->cv_pdata)     
  151.         {    
  152.             cv->cv_pdata = pd_sav;    
  153.             cv->cv_tot_len >>= EXPANED_VAL;    
  154.             return CVEINSERT;    
  155.         }    
  156.     }    
  157.   
  158.     cvmemove_foreward(cv, iter, (char *)cv->cv_pdata + cv->cv_len * cv->cv_size);    
  159.     memcpy(iter, memb, cv->cv_size);    
  160.     cv->cv_len++;    
  161.   
  162.     return CVESUCCESS;    
  163. }    
  164.   
  165. int cvector_insert_at(const cvector cv, size_t index, void *memb)    
  166. {    
  167.     citerator iter;    
  168.   
  169.     if (index >= cv->cv_tot_len)     
  170.     {    
  171.         cv->cv_len = index + 1;    
  172.         while (cv->cv_len >= cv->cv_tot_len) cv->cv_tot_len <<= EXPANED_VAL;    
  173.         cv->cv_pdata = realloc(cv->cv_pdata, cv->cv_tot_len * cv->cv_size);    
  174.         iter = (char *)cv->cv_pdata + cv->cv_size * index;    
  175.         memcpy(iter, memb, cv->cv_size);    
  176.     }    
  177.     else     
  178.     {    
  179.         iter = (char *)cv->cv_pdata + cv->cv_size * index;    
  180.         cvector_insert(cv, iter, memb);    
  181.     }    
  182.   
  183.     return 0;    
  184. }    
  185.   
  186. citerator cvector_next(const cvector cv, citerator iter)    
  187. {    
  188.     return (char *)iter + cv->cv_size;    
  189. }    
  190.   
  191. int cvector_val(const cvector cv, citerator iter, void *memb)    
  192. {    
  193.     memcpy(memb, iter, cv->cv_size);    
  194.     return 0;    
  195. }    
  196.   
  197. int cvector_val_at(const cvector cv, size_t index, void *memb)    
  198. {    
  199.     memcpy(memb, (char *)cv->cv_pdata + index * cv->cv_size, cv->cv_size);    
  200.     return 0;    
  201. }    
  202.   
  203. int cvector_rm(const cvector cv, citerator iter)    
  204. {    
  205.     citerator from;    
  206.     citerator end;    
  207.     CWARNING_ITER(cv, iter, __FILE__, __func__, __LINE__);    
  208.     from = iter;    
  209.     end = cvector_end(cv);    
  210.     memcpy(from, (char *)from + cv->cv_size, (char *)end - (char *)from);    
  211.     cv->cv_len--;    
  212.   
  213.     if ((cv->cv_tot_len >= (MIN_LEN << REDUSED_VAL))    
  214.         && (cv->cv_len <= (cv->cv_tot_len >> REDUSED_VAL)))     
  215.     {    
  216.         void *pd_sav = cv->cv_pdata;    
  217.         cv->cv_tot_len >>= EXPANED_VAL;    
  218.         cv->cv_pdata = realloc(cv->cv_pdata, cv->cv_tot_len * cv->cv_size);    
  219.   
  220.         if (!cv->cv_pdata)     
  221.         {    
  222.             cv->cv_tot_len <<= EXPANED_VAL;    
  223.             cv->cv_pdata = pd_sav;    
  224.             return CVERM;    
  225.         }    
  226.     }    
  227.   
  228.     return CVESUCCESS;    
  229. }    
  230.   
  231. int cvector_rm_at(const cvector cv, size_t index)    
  232. {    
  233.     citerator iter;    
  234.     iter = (char *)cv->cv_pdata + cv->cv_size * index;    
  235.     CWARNING_ITER(cv, iter, __FILE__, __func__, __LINE__);    
  236.     return cvector_rm(cv, iter);    
  237. }    
  238.   
  239. void cv_info(const cvector cv)    
  240. {    
  241.     printf("\n\ntot :%s : %d\n", __func__, cv->cv_tot_len);    
  242.     printf("len :%s : %d\n",     __func__, cv->cv_len);    
  243.     printf("size:%s : %d\n\n",   __func__, cv->cv_size);    
  244.     return;    
  245. }    
  246.   
  247. void cv_print(const cvector cv)    
  248. {    
  249.     int num;    
  250.     citerator iter;    
  251.   
  252.     if (cvector_length(cv) == 0)    
  253.         fprintf(stderr, "file:%s func:%s line:%d error, null length cvector!!\n", __FILE__, __func__, __LINE__);    
  254.   
  255.     for (iter = cvector_begin(cv);     
  256.         iter != cvector_end(cv);    
  257.         iter = cvector_next(cv, iter))     
  258.     {    
  259.         cvector_iter_val(cv, iter, &num);    
  260.         printf("var:%d at:%d\n", num, cvector_iter_at(cv, iter));    
  261.     }    
  262.   
  263.     return;    
  264. }    

//main.cpp

  1. #include "cvector.h"  
  2.   
  3. int main()  
  4. {  
  5.     int i = 1;  
  6.     cvector cv = cvector_create(sizeof(int));  
  7.     cvector_pushback(cv, &i);  
  8.     cvector_pushback(cv, &i);  
  9.     cvector_pushback(cv, &i);  
  10.     cvector_pushback(cv, &i);  
  11.     cv_print(cv);  
  12.     cvector_destroy(cv);  
  13.     return 0;  
  14. }  
原创粉丝点击