免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3679 | 回复: 5
打印 上一主题 下一主题

[C] 给出一个我用c语言简单实现的类似c++的泛型和迭代器 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-01 21:59 |只看该作者 |倒序浏览
纯属无聊,在加班刷数据的时候写的,给出一个我用c语言简单实现的类似c++的泛型和迭代器,希望大家批评指正。

先说明一下,只是简单的实现了一个链表,用long和double作为链表的元素类型.
没有实现内存释放,累了不想写了.

如果大家觉得可以的话,以后把迭代器和list分离,写的有点深度点,也可以用rb-tree来实现一个set。

编译选项:

gcc  -std=c99 -o iterator  iterator.c

贴代码:
  1. /*
  2. *This program is a simple implement of c++ general prg
  3. *and iterator design pattern.
  4. *author: zhoutianzuo
  5. */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <malloc.h>

  9. typedef struct List_Head List_Head, *p_List_Head;   
  10. #define HEAD_LIST()                                     \
  11.         struct List_Head {                                  \
  12.                 struct List_Head *prev;                         \
  13.                 struct List_Head *next;                         \
  14.                 p_List_Head (*get_next)(p_List_Head);           \
  15.                 p_List_Head (*get_prev)(p_List_Head);           \
  16.         };                                                  \
  17.     p_List_Head get_next_List_Head(p_List_Head vp_inList_Head) { \
  18.             return vp_inList_Head->next;                                     \
  19.     }                                                            \
  20.                                                                  \
  21.     p_List_Head get_prev_List_Head(p_List_Head vp_inList_Head) { \
  22.             return vp_inList_Head->prev;                             \
  23.     }


  24. #define CLASS_DEFINE(CLASS_NAME, HEAD, TY)              \
  25.         typedef struct  CLASS_NAME CLASS_NAME;              \
  26.         typedef CLASS_NAME* iterator_##CLASS_NAME ;                    \
  27.     struct CLASS_NAME{                                  \
  28.                 HEAD         head_node;                         \
  29.                 TY           value;                             \
  30.         void         (*initial)(CLASS_NAME *);          \
  31.         CLASS_NAME*  (*get_next)(CLASS_NAME *);         \
  32.         CLASS_NAME*  (*get_prev)(CLASS_NAME *);         \
  33.         CLASS_NAME*  (*end)(CLASS_NAME *);              \
  34.         CLASS_NAME*  (*begin)(CLASS_NAME *);            \
  35.         CLASS_NAME*  (*insert)(CLASS_NAME *, TY);       \
  36.         CLASS_NAME*  (*delete)(CLASS_NAME *, TY);       \
  37.         };                                                  \
  38.     CLASS_NAME*  get_next_##CLASS_NAME(CLASS_NAME *vp_in) {                     \
  39.                 return   (CLASS_NAME *)(vp_in->head_node.get_next(&vp_in->head_node));  \
  40.     }                                                                           \
  41.     CLASS_NAME*  get_prev_##CLASS_NAME(CLASS_NAME *vp_in) {                     \
  42.                 return   (CLASS_NAME *)(vp_in->head_node.get_prev(&vp_in->head_node));  \
  43.     }                                                                           \
  44.     CLASS_NAME*  begin##CLASS_NAME(CLASS_NAME *vp_in) {                         \
  45.                 return (CLASS_NAME *)(vp_in->head_node.next);                           \
  46.     }                                                                           \
  47.     CLASS_NAME*  end##CLASS_NAME(CLASS_NAME *vp_in) {                           \
  48.                 return (CLASS_NAME *)(&(vp_in->head_node) );                            \
  49.     }                                                                           \
  50.         extern void initial_##CLASS_NAME(CLASS_NAME *);                             \
  51.     CLASS_NAME*  insert_##CLASS_NAME(CLASS_NAME *vp_in, TY v_inValue) {         \
  52.                 CLASS_NAME *new_node  = (CLASS_NAME *)malloc(sizeof(CLASS_NAME));       \
  53.                 new_node->initial     = initial_##CLASS_NAME;                           \
  54.                 new_node->initial(new_node);                                            \
  55.                 new_node->value       = v_inValue;                                      \
  56.                 new_node->head_node.next = vp_in->head_node.next;                       \
  57.                 vp_in->head_node.next    = &(new_node->head_node);                      \
  58.                 printf("Do insert successful!\n");                                      \
  59.     }                                                                           \
  60.     CLASS_NAME*  delete_##CLASS_NAME(CLASS_NAME *vp_in, TY v_inValue) {         \
  61.     }                                                                           \
  62.     void  initial_##CLASS_NAME(CLASS_NAME *vp_in) {                             \
  63.                 vp_in->head_node.get_prev = get_prev_List_Head;                         \
  64.                 vp_in->head_node.get_next = get_next_List_Head;                         \
  65.                 vp_in->head_node.next = &(vp_in->head_node);                            \
  66.                 vp_in->head_node.prev = &(vp_in->head_node);                            \
  67.                 vp_in->get_next       = get_next_##CLASS_NAME;                          \
  68.             vp_in->get_prev       = get_prev_##CLASS_NAME;                          \
  69.             vp_in->insert         = insert_##CLASS_NAME;                            \
  70.             vp_in->delete         = delete_##CLASS_NAME;                            \
  71.             vp_in->begin          = begin##CLASS_NAME;                              \
  72.             vp_in->end            = end##CLASS_NAME;                                \
  73.     }

  74. /*give the struct definition here.*/
  75. HEAD_LIST()
  76. CLASS_DEFINE(List_long, List_Head, long)
  77. CLASS_DEFINE(List_double, List_Head, double)
  78.        
  79. /*ADD CALL BACK FUNCTION*/
  80. /*must define the function here, for ......*/

  81. int main()
  82. {
  83.         List_long * my_list = (List_long*)malloc(sizeof(List_long) );
  84.         my_list->initial    = initial_List_long;
  85.         my_list->initial(my_list);
  86.        
  87.         for(int i = 0; i < 20; i++)
  88.             my_list->insert(my_list, 100 - 5*i);
  89.        
  90.         iterator_List_long my_iter =  my_list->begin(my_list);
  91.         while(my_iter != my_list->end(my_list) ) {
  92.                 printf("Now, the value of the iterator is %ld\n", my_iter->value);
  93.                 my_iter = my_iter->get_next(my_iter);
  94.     }
  95.        
  96.         List_double * my_list_1 = (List_double*)malloc(sizeof(List_double) );
  97.         my_list_1->initial      = initial_List_double;
  98.         my_list_1->initial(my_list_1);
  99.        
  100.         for(int i = 0; i < 20; i++)
  101.             my_list_1->insert(my_list_1, 100.0 - 5.0*i);
  102.        
  103.         iterator_List_double my_iter_1 =  my_list_1->begin(my_list_1);
  104.         while(my_iter_1 != my_list_1->end(my_list_1) ) {
  105.                 printf("Now, the value of the iterator is %lf\n", my_iter_1->value);
  106.                 my_iter_1 = my_iter_1->get_next(my_iter_1);
  107.     }

  108.         return 0;
  109. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-04-01 22:00 |只看该作者
自己顶一个吧。

论坛徽章:
0
3 [报告]
发表于 2010-04-02 11:22 |只看该作者
帮你顶吧!

论坛徽章:
0
4 [报告]
发表于 2010-04-02 17:17 |只看该作者
本帖最后由 souldemo 于 2010-04-02 17:19 编辑

有点像C与C++搞出来的杂种。

LZ,不是说你不好。
只是感觉这样不符合C的风格。
意义不大,而且也不高效,反而低效占内存。
更不能称泛型。
但是还是支持楼主。

论坛徽章:
0
5 [报告]
发表于 2010-04-02 19:03 |只看该作者
有点像C与C++搞出来的杂种。

LZ,不是说你不好。
只是感觉这样不符合C的风格。
意义不大,而且也不高效 ...
souldemo 发表于 2010-04-02 17:17



可能,用c实现c++本来就有点不伦不类,但是思想上还是向c++看齐,呵呵。

这里感觉就完全是一个c的底盘,而且,还是很偏激的c的底盘。

个人感觉,不要太过偏执。

论坛徽章:
0
6 [报告]
发表于 2010-04-02 20:23 |只看该作者
man queue
man tree
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP