- 论坛徽章:
- 0
|
纯属无聊,在加班刷数据的时候写的,给出一个我用c语言简单实现的类似c++的泛型和迭代器,希望大家批评指正。
先说明一下,只是简单的实现了一个链表,用long和double作为链表的元素类型.
没有实现内存释放,累了不想写了.
如果大家觉得可以的话,以后把迭代器和list分离,写的有点深度点,也可以用rb-tree来实现一个set。
编译选项:
gcc -std=c99 -o iterator iterator.c
贴代码:- /*
- *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;
- }
复制代码 |
|