C语言网

 找回密码
 加入社区!

QQ登录

只需一步,快速开始

查看: 262|回复: 1

发一段代码_大家可以看看 [复制链接]

Rank: 6Rank: 6

主题
68
帖子
348
C币
578 枚
在线时间
57 小时
发表于 2010-8-26 09:06:05 |显示全部楼层
  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. /*ADD CALL BACK FUNCTION*/
  79. /*must define the function here, for ......*/

  80. int main()
  81. {
  82. List_long * my_list = (List_long*)malloc(sizeof(List_long) );
  83. my_list->initial = initial_List_long;
  84. my_list->initial(my_list);

  85. for(int i = 0; i < 20; i++)
  86. my_list->insert(my_list, 100 - 5*i);

  87. iterator_List_long my_iter = my_list->begin(my_list);
  88. while(my_iter != my_list->end(my_list) ) {
  89. printf("Now, the value of the iterator is %ld\n", my_iter->value);
  90. my_iter = my_iter->get_next(my_iter);
  91. }

  92. List_double * my_list_1 = (List_double*)malloc(sizeof(List_double) );
  93. my_list_1->initial = initial_List_double;
  94. my_list_1->initial(my_list_1);

  95. for(int i = 0; i < 20; i++)
  96. my_list_1->insert(my_list_1, 100.0 - 5.0*i);

  97. iterator_List_double my_iter_1 = my_list_1->begin(my_list_1);
  98. while(my_iter_1 != my_list_1->end(my_list_1) ) {
  99. printf("Now, the value of the iterator is %lf\n", my_iter_1->value);
  100. my_iter_1 = my_iter_1->get_next(my_iter_1);
  101. }

  102. return 0;
  103. }
复制代码

Rank: 6Rank: 6

主题
68
帖子
348
C币
578 枚
在线时间
57 小时
发表于 2010-8-26 09:07:39 |显示全部楼层
不是我写的  是摘录的
您需要登录后才可以回帖 登录 | 加入社区!

C语言 ( 粤ICP备11042647号-2 )

GMT+8, 2012-2-7 23:01

©2009-2011 cyuyan.com.cn

回顶部