微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 使用迭代器如何实现指针前移或后移

使用迭代器如何实现指针前移或后移

时间:08-27 来源:周立功单片机 点击:

31      dlist_int_t          node[5];                         // 定义5个结点空间

32      int             i;

33 

34      dlist_init(&head);

35

36      for (i = 0; i < 5; i++) {                           // 将5个结点添加至链表尾部

37          node[i].data = 5 - i;                             // 使值的顺序为 5 ~ 1

38          dlist_add_tail(&head, &(node[i].node));

39      }

40      dlist_iterator_if_get(&iterator_if);

41

42     printf("\nBefore bubble sort:\n");

43     dlist_foreach (&head, list_node_process, NULL);      // 打印排序前的情况

44

45      iter_sort(&iterator_if, dlist_begin_get(&head), dlist_end_get(&head),__compare, __swap);

46

47      printf("\nAfter bubble sort:\n");

48      dlist_foreach (&head, list_node_process, NULL);   // 打印排序后的情况

49      return 0;

50  }

在这里,使用了dlist_foreach()遍历函数,既然通过迭代器能够实现冒泡排序,那么也能通过迭代器实现简单的遍历算法,此时遍历算法与具体容器无关。遍历函数的原型如下:

void  iter_foreach(iterator_if_t *p_if, iterator_t begin, iterator_t end, visit_t visit, void *p_arg); 

其中,p_if表示算法使用的迭代器接口,begin与end表示算法需要处理的迭代器范围,visit是用户自定义的遍历迭代器的函数。其类型visit_t定义如下:

typedef int (*visit_t)(void *p_arg, iterator_t it); 

visit_t的参数是p_arg指针和it迭代器,其返回值为int类型的函数指针。每遍历一个结点均会调用visit指向的函数,传递给p_arg的值即为用户参数,其值为iter_foreach()函数的p_arg参数,p_arg的值完全是由用户决定的,传递给it迭代器的值即为指向当前遍历的迭代器,iter_foreach()函数的实现详见程序清单3.58。

程序清单3.58  遍历算法函数

1    void  iter_foreach(iterator_if_t *p_if, iterator_t begin, iterator_t end, visit_t visit, void *p_arg)

2    {

3        iterator_t it = begin;

4        while(it != end){

5            if (visit(p_arg, it) < 0) {                        // 若返回值为负值,表明用户终止了遍历 

6                return;

7            }

8            iterator_next(p_if, &it);                        // 让迭代器向后移动

9        }

10  }

现在可以将程序清单3.57中的第43行和第48行中的dlist_foreach()函数修改为使用iter_foreach()函数,看能否得到

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top