• 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 }
  • 相关阅读:
    Datawhale文化运营 —— 推文排版
    Datawhale文化运营 —— 策划活动
    Datawhale文化运营 —— 选题
    Datawhale文化运营 —— 分析公众号运营
    前端面试——记一次于某司的经历
    Win10+Cent7双系统安装
    梳理 Opengl ES 3.0 (五)shader运行原理
    梳理 Opengl ES 3.0 (三)顶点坐标变换
    梳理 Opengl ES 3.0 (二)剖析一个GLSL程序
    梳理 Opengl ES 3.0 (一)宏观着眼
  • 原文地址:https://www.cnblogs.com/chenweilin/p/12692070.html
Copyright © 2020-2023  润新知