- 主题
- 68
- 帖子
- 348
- 精华
- 0
- 积分
- 635
- C币
- 578 枚
- 在线时间
- 57 小时
- 注册时间
- 2010-7-9
- 最后登录
- 2012-1-28
- 性别
- 保密
 
- 主题
- 68
- 帖子
- 348
- C币
- 578 枚
- 在线时间
- 57 小时
|
发表于 2010-8-26 09:06:05
|显示全部楼层
- /*
- *This program is a simple implement of c++ general prg
- *and iterator design pattern.
- *author: zhoutianzuo
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <malloc.h>
- typedef struct List_Head List_Head, *p_List_Head;
- #define HEAD_LIST() \
- struct List_Head { \
- struct List_Head *prev; \
- struct List_Head *next; \
- p_List_Head (*get_next)(p_List_Head); \
- p_List_Head (*get_prev)(p_List_Head); \
- }; \
- p_List_Head get_next_List_Head(p_List_Head vp_inList_Head) { \
- return vp_inList_Head->next; \
- } \
- \
- p_List_Head get_prev_List_Head(p_List_Head vp_inList_Head) { \
- return vp_inList_Head->prev; \
- }
- #define CLASS_DEFINE(CLASS_NAME, HEAD, TY) \
- typedef struct CLASS_NAME CLASS_NAME; \
- typedef CLASS_NAME* iterator_##CLASS_NAME ; \
- struct CLASS_NAME{ \
- HEAD head_node; \
- TY value; \
- void (*initial)(CLASS_NAME *); \
- CLASS_NAME* (*get_next)(CLASS_NAME *); \
- CLASS_NAME* (*get_prev)(CLASS_NAME *); \
- CLASS_NAME* (*end)(CLASS_NAME *); \
- CLASS_NAME* (*begin)(CLASS_NAME *); \
- CLASS_NAME* (*insert)(CLASS_NAME *, TY); \
- CLASS_NAME* (*delete)(CLASS_NAME *, TY); \
- }; \
- CLASS_NAME* get_next_##CLASS_NAME(CLASS_NAME *vp_in) { \
- return (CLASS_NAME *)(vp_in->head_node.get_next(&vp_in->head_node)); \
- } \
- CLASS_NAME* get_prev_##CLASS_NAME(CLASS_NAME *vp_in) { \
- return (CLASS_NAME *)(vp_in->head_node.get_prev(&vp_in->head_node)); \
- } \
- CLASS_NAME* begin##CLASS_NAME(CLASS_NAME *vp_in) { \
- return (CLASS_NAME *)(vp_in->head_node.next); \
- } \
- CLASS_NAME* end##CLASS_NAME(CLASS_NAME *vp_in) { \
- return (CLASS_NAME *)(&(vp_in->head_node) ); \
- } \
- extern void initial_##CLASS_NAME(CLASS_NAME *); \
- CLASS_NAME* insert_##CLASS_NAME(CLASS_NAME *vp_in, TY v_inValue) { \
- CLASS_NAME *new_node = (CLASS_NAME *)malloc(sizeof(CLASS_NAME)); \
- new_node->initial = initial_##CLASS_NAME; \
- new_node->initial(new_node); \
- new_node->value = v_inValue; \
- new_node->head_node.next = vp_in->head_node.next; \
- vp_in->head_node.next = &(new_node->head_node); \
- printf("Do insert successful!\n"); \
- } \
- CLASS_NAME* delete_##CLASS_NAME(CLASS_NAME *vp_in, TY v_inValue) { \
- } \
- void initial_##CLASS_NAME(CLASS_NAME *vp_in) { \
- vp_in->head_node.get_prev = get_prev_List_Head; \
- vp_in->head_node.get_next = get_next_List_Head; \
- vp_in->head_node.next = &(vp_in->head_node); \
- vp_in->head_node.prev = &(vp_in->head_node); \
- vp_in->get_next = get_next_##CLASS_NAME; \
- vp_in->get_prev = get_prev_##CLASS_NAME; \
- vp_in->insert = insert_##CLASS_NAME; \
- vp_in->delete = delete_##CLASS_NAME; \
- vp_in->begin = begin##CLASS_NAME; \
- vp_in->end = end##CLASS_NAME; \
- }
- /*give the struct definition here.*/
- HEAD_LIST()
- CLASS_DEFINE(List_long, List_Head, long)
- CLASS_DEFINE(List_double, List_Head, double)
- /*ADD CALL BACK FUNCTION*/
- /*must define the function here, for ......*/
- int main()
- {
- List_long * my_list = (List_long*)malloc(sizeof(List_long) );
- my_list->initial = initial_List_long;
- my_list->initial(my_list);
- for(int i = 0; i < 20; i++)
- my_list->insert(my_list, 100 - 5*i);
- iterator_List_long my_iter = my_list->begin(my_list);
- while(my_iter != my_list->end(my_list) ) {
- printf("Now, the value of the iterator is %ld\n", my_iter->value);
- my_iter = my_iter->get_next(my_iter);
- }
- List_double * my_list_1 = (List_double*)malloc(sizeof(List_double) );
- my_list_1->initial = initial_List_double;
- my_list_1->initial(my_list_1);
- for(int i = 0; i < 20; i++)
- my_list_1->insert(my_list_1, 100.0 - 5.0*i);
- iterator_List_double my_iter_1 = my_list_1->begin(my_list_1);
- while(my_iter_1 != my_list_1->end(my_list_1) ) {
- printf("Now, the value of the iterator is %lf\n", my_iter_1->value);
- my_iter_1 = my_iter_1->get_next(my_iter_1);
- }
- return 0;
- }
复制代码 |
|