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 }