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
16void iterator_if_init(iterator_if_t *p_if, iterator_next_t pfn_next, iterator_prev_t pfn_prev);
17void iterator_next(iterator_if_t *p_if, iterator_t *p_iter); //迭代器后移函数,相当于++
18void iterator_prev(iterator_if_t *p_if, iterator_t *p_iter); //迭代器前移函数,相当于--
19//void iterator_if_get(iterator_if_t *p_if);
20void iter_sort(iterator_if_t *p_if, iterator_t begin, iterator_t end, compare_t compare, swap_t swap);
21void 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
3void 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
9void iterator_next(iterator_if_t *p_if, iterator_t *p_iter)
10 {
11    p_if->pfn_next(p_iter);
12 }
13
14void 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*/
22void iter_sort(iterator_if_t *p_if, iterator_t begin, iterator_t end, compare_t compare, swap_t swap)
23 {
24int flag = 1; // flag = 1,表⽰指针的内容未交换
25    iterator_t it1 = begin; // it1指向需要排序的⾸元素
26    iterator_t it2 = end;  // it2指向需要排序的最后⼀个元素之后
27
28    iterator_t it_next;
29if (begin == end)
30    {
c语言的冒泡排序算法
31return;
32    }
33
34while (it2 != begin)
35    {
36        it1 = begin;
37        flag = 1;
38while(it1 != it2)
39        {
40            it_next = it1; //暂存
41            iterator_next(p_if, &it_next); // it_next为it1的下⼀个元素
42if(it_next == it2) break;
43if(compare(it1, it_next) > 0)
44            {
45                swap(it1, it_next); //交换内容
46                flag = 0; // flag = 0,表⽰指针的内容已交换
47            }
48            it1 = it_next; // it1的下⼀个元素
49        }
50if(flag) return; //没有交换,表⽰已经有序,则直接返回
51        iterator_prev(p_if, &it2); // it2向前移
53 }
54
55void 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;
58while(it != end)
59    {
60if (visit(p_arg, it) < 0)
61        { //若返回值为负值,表⽰⽤户终⽌了遍历
62return;
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;
10int data;
11 }dlist_int_t;
12
13static void __dlist_iterator_next(iterator_t *p_iter) //让迭代器指向容器的下⼀个数据
14 {
15    *p_iter = ((dlist_node_t *)*p_iter)->p_next;
16 }
17
18static void __dlist_iterator_prev(iterator_t *p_iter) //让迭代器指向容器的上⼀个数据
19 {
20    *p_iter = ((dlist_node_t *)*p_iter)->p_prev;
21 }
22
23int list_node_process(void *p_arg, dlist_node_t *p_node)
24 {
25    printf("%d ", ((dlist_int_t *)p_node) -> data);
26return0;
27 }
28
29static int __visit(void *p_arg, iterator_t it)
30 {
31    printf("%d ", ((dlist_int_t *)it)->data);
32return0;
33 }
34
35static int __compare(iterator_t it1, iterator_t it2)
36 {
37return ((dlist_int_t *)it1) -> data - ((dlist_int_t *)it2) -> data;
38 }
39
40static void __swap(iterator_t it1, iterator_t it2)
41 {
42int 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
47int main(void)
48 {
49    iterator_if_t iterator_if;
50    dlist_head_t head; //定义链表头结点
51    dlist_int_t node[5]; //定义5个结点空间
52int i;
53
54    dlist_init(&head);
55
56for (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);
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
80return0;
81 }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。