1. iterator.h
1 #ifndef _ITERATOR_H 2 #define _ITERATOR_H 3 4 typedef void *iterator_t; 5 typedef void (*iterator_next_t)(iterator_t *p_iter); 6 typedef void (*iterator_prev_t)(iterator_t *p_iter); 7 typedef int (*compare_t)(iterator_t it1, iterator_t it2); 8 typedef void (*swap_t)(iterator_t it1, iterator_t it2); 9 typedef int (*visit_t)(void *p_arg, iterator_t it); 10 11 typedef struct _iterator_if{ 12 iterator_next_t pfn_next; //调用迭代器后移的函数指针,相当于p1++ 13 iterator_prev_t pfn_prev; //调用迭代器前移的函数指针,相当于p2-- 14 }iterator_if_t; 15 16 void iterator_if_init(iterator_if_t *p_if, iterator_next_t pfn_next, iterator_prev_t pfn_prev); 17 void iterator_next(iterator_if_t *p_if, iterator_t *p_iter); //迭代器后移函数,相当于++ 18 void iterator_prev(iterator_if_t *p_if, iterator_t *p_iter); //迭代器前移函数,相当于-- 19 //void iterator_if_get(iterator_if_t *p_if); 20 void iter_sort(iterator_if_t *p_if, iterator_t begin, iterator_t end, compare_t compare, swap_t swap); 21 void iter_foreach(iterator_if_t *p_if, iterator_t begin, iterator_t end, visit_t visit, void *p_arg); 22 #endif
2. iterator.c
1 #include "iterator.h" 2 3 void iterator_if_init(iterator_if_t *p_if, iterator_next_t pfn_next, iterator_prev_t pfn_prev) 4 { 5 p_if->pfn_next = pfn_next; 6 p_if->pfn_prev = pfn_prev; 7 } 8 9 void iterator_next(iterator_if_t *p_if, iterator_t *p_iter) 10 { 11 p_if->pfn_next(p_iter); 12 } 13 14 void iterator_prev(iterator_if_t *p_if, iterator_t *p_iter) 15 { 16 p_if->pfn_prev(p_iter); 17 } 18 19 /** 20 * @breif 冒泡排序算法函数 21 */ 22 void iter_sort(iterator_if_t *p_if, iterator_t begin, iterator_t end, compare_t compare, swap_t swap) 23 { 24 int flag = 1; // flag = 1,表示指针的内容未交换 25 iterator_t it1 = begin; // it1指向需要排序的首元素 26 iterator_t it2 = end; // it2指向需要排序的最后一个元素之后 27 28 iterator_t it_next; 29 if (begin == end) 30 { 31 return; 32 } 33 34 while (it2 != begin) 35 { 36 it1 = begin; 37 flag = 1; 38 while(it1 != it2) 39 { 40 it_next = it1; //暂存 41 iterator_next(p_if, &it_next); // it_next为it1的下一个元素 42 if(it_next == it2) break; 43 if(compare(it1, it_next) > 0) 44 { 45 swap(it1, it_next); //交换内容 46 flag = 0; // flag = 0,表示指针的内容已交换 47 } 48 it1 = it_next; // it1的下一个元素 49 } 50 if(flag) return; //没有交换,表示已经有序,则直接返回 51 iterator_prev(p_if, &it2); // it2向前移 52 } 53 } 54 55 void iter_foreach(iterator_if_t *p_if, iterator_t begin, iterator_t end, visit_t visit, void *p_arg) 56 { 57 iterator_t it = begin; 58 while(it != end) 59 { 60 if (visit(p_arg, it) < 0) 61 { //若返回值为负值,表示用户终止了遍历 62 return; 63 } 64 iterator_next(p_if, &it);//让迭代器向后移动 65 } 66 }
3. demo
1 #include <stdio.h> 2 #include "dlist.h" 3 #include "iterator.h" 4 5 #define ITERATOR_FOREATCH_EN 1 6 7 typedef struct _dlist_int 8 { 9 dlist_node_t node; 10 int data; 11 }dlist_int_t; 12 13 static void __dlist_iterator_next(iterator_t *p_iter) //让迭代器指向容器的下一个数据 14 { 15 *p_iter = ((dlist_node_t *)*p_iter)->p_next; 16 } 17 18 static void __dlist_iterator_prev(iterator_t *p_iter) //让迭代器指向容器的上一个数据 19 { 20 *p_iter = ((dlist_node_t *)*p_iter)->p_prev; 21 } 22 23 int list_node_process(void *p_arg, dlist_node_t *p_node) 24 { 25 printf("%d ", ((dlist_int_t *)p_node) -> data); 26 return 0; 27 } 28 29 static int __visit(void *p_arg, iterator_t it) 30 { 31 printf("%d ", ((dlist_int_t *)it)->data); 32 return 0; 33 } 34 35 static int __compare(iterator_t it1, iterator_t it2) 36 { 37 return ((dlist_int_t *)it1) -> data - ((dlist_int_t *)it2) -> data; 38 } 39 40 static void __swap(iterator_t it1, iterator_t it2) 41 { 42 int data = ((dlist_int_t *)it2) -> data; 43 ((dlist_int_t *)it2) -> data = ((dlist_int_t *)it1) -> data; 44 ((dlist_int_t *)it1) -> data = data; 45 } 46 47 int main(void) 48 { 49 iterator_if_t iterator_if; 50 dlist_head_t head; //定义链表头结点 51 dlist_int_t node[5]; //定义5个结点空间 52 int i; 53 54 dlist_init(&head); 55 56 for (i = 0; i < 5; i++) 57 { //将5个结点添加至链表尾部 58 node[i].data = 5 - i; // 使值的顺序为 5~1 59 dlist_add_tail(&head, &(node[i].node)); 60 } 61 iterator_if_init(&iterator_if, __dlist_iterator_next, __dlist_iterator_prev); 62 63 printf("\nBefore bubble sort:\n"); 64 #if (ITERATOR_FOREATCH_EN) 65 iter_foreach(&iterator_if,dlist_begin_get(&head), dlist_end_get(&head), __visit, NULL); 66 #else 67 dlist_foreach(&head, list_node_process, NULL); //打印排序前的情况 68 #endif 69 70 iter_sort(&iterator_if, dlist_begin_get(&head), dlist_end_get(&head), __compare, __swap); 71 72 printf("\nAfter bubble sort:\n"); 73 74 #if (ITERATOR_FOREATCH_EN) 75 iter_foreach(&iterator_if,dlist_begin_get(&head), dlist_end_get(&head), __visit, NULL); 76 #else 77 dlist_foreach (&head, list_node_process, NULL); //打印排序后的情况 78 #endif 79 80 return 0; 81 }