c语言实现迭代器iterator

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("
Before bubble sort:
");
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("
After bubble sort:
");
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 }
原文地址:https://www.cnblogs.com/chenweilin/p/12692070.html