使用迭代器如何实现指针前移或后移
31 dlist_int_t node[5]; // 定义5个结点空间
32 int i;
3334 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);
4142 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()函数,看能否得到
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)
- 算法的泛化问题,这些坑你可能都经历过!|周立功教你学软件设计(08-01)