使用迭代器如何实现指针前移或后移
18 if(compare(it1, it_next) >
19 swap(it1, it_next); // 交换内容
20 flag = 0; // flag = 0,表示指针的内容已交换
21 }22 it1 = it_next; // it1 的下一个元素
23 }
24 if(flag) return; // 没有交换,表示已经有序,则直接返回
25 iterator_prev(p_if, &it2); // it2向前移
26 }
27 }下面以一个简单的例子来测试验证基于迭代器的冒泡排序算法,详见程序清单3.57。将整数存放到双向链表中,首先将5、4、3、2、1分别加在链表的尾部,接着调用dlist_foreach()遍历链表,看是否符合预期,然后再调用算法库的iter_sort()排序。当排序完毕后链表的元素应该是从小到大排列的,再次调用算法库的dilst_foreach()遍历链表,看是否符合预期。
程序清单3.57 使用双向链表、算法和迭代器
1 #include
2 #include "iterator.h"
3
4 typedef struct _dlist_int{
5 dlist_node_t node; // 包含链表结点
6 int data; // int类型数据
7 }dlist_int_t;
8
9 int list_node_process(void *p_arg, dlist_node_t *p_node)
10 {
11 printf("%d ", ((dlist_int_t *)p_node) -> data);12 return 0;
13 }
14
15 static int __compare(iterator_t it1, iterator_t it2)
16 {
17 return ((dlist_int_t *)it1) -> data - ((dlist_int_t *)it2) -> data;
18 }
19
20 static void __swap(iterator_t it1, iterator_t it2)
21 {
22 int data = ((dlist_int_t *)it2) -> data;
23 ((dlist_int_t *)it2) -> data = ((dlist_int_t *)it1) -> data;
24 ((dlist_int_t *)it1) -> data = data;
25 }
2627 int main(int argc, char *argv[])
28 {
29 iterator_if_t iterator_if;
30 dlist_head_t head; // 定义链表头结点
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)
- 算法的泛化问题,这些坑你可能都经历过!|周立功教你学软件设计(08-01)