`
zsxxsz
  • 浏览: 452033 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C语言中也可以方便地进行遍历

阅读更多

  请先看一个例子,如下:

    void test()
    {
        ACL_HTABLE *table = acl_htable_create(10, 0);  /* 创建哈希表 */
        ACL_HTABLE_ITER iter;  /* 哈希表的遍历变量 */
        char *value, key[32];
        int   i;

        for (i = 0; i < 100; i++) {
            value = (char*) acl_mystrdup("value");
            snprintf(key, sizeof(key), "key:%d", i);
            (void) acl_htable_enter(table, key, value);  /* 向哈希表中添加元素 */
        }

        /* 遍历哈希表中的所有元素 */
        acl_htable_foreach(iter, table) {
            printf("%s=%s\n", acl_htable_iter_key(iter), acl_htable_iter_value(iter));
        }

        /* 释放哈希表表 */
        acl_htable_free(table, acl_myfree_fn);
    }

 

    哈,用C语言也可以实现其它编程语言里的迭代器,而且用法也异常简单,虽然它没有C++中的功能强大,但却比较实用,而且操作手法有点象D、JAVA的遍历方式。下面再请看一个利用ACL里的先进先出队列的例子:

 

    void test()
    {
        ACL_FIFO fifo;
        ACL_FIFO_ITER iter;
        char *data;
        int   i;

        acl_fifo_init(&fifo);  /* 初始化队列对象 */

        for (i = 0; i < 10; i++) {
            data = acl_mymalloc(32);
            snprintf(data, 32, "data: %d", i);
            acl_fifo_push(&fifo, data);  /* 向队列中添加元素 */
        }

        /* 反向遍历队列中的所有元素 */
        acl_fifo_foreach_reverse(iter, &fifo) {
            printf("%s\n", (char*) iter.ptr->data);  /* 打印元素字符串 */
        }

        while (1) {
            /* 弹出队列中的所有元素 */
            data = acl_fifo_pop(&fifo);
            if (data == NULL)
                break;
        }
    }
 

      上面这个是ACL里反向遍历先进先出队列的例子。

  我们在使用 C++ 里的迭代器里,其实基本上都是在用C++标准模板库的算法而已,这些常用算法无非也就是动态数组、哈希表、队列、堆栈等数据结构而已,而现在C++的使用替代器的过程未免过于烦琐(模板是由C++发扬光大,但现在搞的也太罗嗦了,不知C++标准委员会里的那些老头整天都在忙些什么,呵呵),我还是比较喜欢Java和D语言里的使用方式。

  上面的两个例子的遍历过程其实是由宏来实现的,效率不会有问题,但写法也未免有些拙劣,呵呵,不过实用即可。具体实现方式请参考ACL里的头文件:lib_acl/include/stdlib/ 下的 acl_htable.h, acl_fifo.h. ACL库下载位置:https://acl.sourceforge.net

 

个人微博:http://weibo.com/zsxxsz

分享到:
评论
2 楼 zsxxsz 2009-08-17  
其实这还是一种函数回调的遍历方式,在ACL中的哈希表中有类似的作法,如修改上面例子的哈希表的遍历为回调遍历的方式如下:

static void walk_fn(ACL_HTABLE_INFO *info, void *arg acl_unused)
{
        printf("%s=%s\n", info->key.c_key, (char*) info->value);
}

void test()
{
        ACL_HTABLE *table = acl_htable_create(10, 0);  /* 创建哈希表 */
        ACL_HTABLE_ITER iter;  /* 哈希表的遍历变量 */
        char *value, key[32];
        int   i;

        for (i = 0; i < 100; i++) {
            value = (char*) acl_mystrdup("value");
            snprintf(key, sizeof(key), "key:%d", i);
            (void) acl_htable_enter(table, key, value);  /* 向哈希表中添加元素 */
        }

        /* 遍历哈希表中的所有元素 */
        acl_htable_walk(table, walk_fn, NULL);

        /* 释放哈希表表 */
        acl_htable_free(table, acl_myfree_fn);
}


但以回调方式遍历总给人有点不直观的感觉。
1 楼 night_stalker 2009-08-16  
XCode 的 C 可以这样用:
void range_each(int from, int to, void (^f)(int)) {
    int i;
    for(i = from; i < to; ++i)
        f(i);
}
...
    range_each(2, 15, ^(int x){ 
        printf("%d",x);
    });
...

相关推荐

    C语言实现二叉树的创建遍历

    ### C语言实现二叉树的创建与遍历 ...通过递归的方法,我们可以方便地实现这些功能。二叉树作为一种基本的数据结构,在计算机科学中有着广泛的应用。掌握其基本操作对于理解和解决复杂问题非常有帮助。

    数据结构用C语言课程设计之图的深度遍历与广度遍历.doc

    在图的遍历过程中,C语言提供了灵活的数据结构和控制流程,可以方便地实现这两种遍历算法。 需要注意的是,代码中的队列实现存在一个潜在问题:如果队列满(`QueueIn`操作),并未提供扩展队列大小的功能,这可能...

    C语言数据结构之线索二叉树及其遍历

    传统的链式结构只能体现一种父子关系,¥不能直接得到节点在遍历中的前驱和后继¥,而我们知道二叉链表表示的二叉树中有大量的空指针,当使用这些空的指针存放指向节点的前驱和后继的指针时,则可以更加方便的运用...

    树的非递归遍历算法层次遍历与深度遍历C语言源码

    在C语言中,可以使用数组模拟队列,或者使用标准库中的`#include &lt;queue&gt;`,其中的`queue`结构可以方便地进行队列操作。 **深度遍历(DFS)**: 深度遍历分为前序遍历、中序遍历和后序遍历三种方式,通常使用栈...

    层次遍历二叉树C语言实现

    ### 层次遍历二叉树C语言实现...通过理解这些代码,我们可以更好地掌握二叉树的遍历算法,以及C语言中结构体、指针、链表和队列等数据结构的应用技巧。这对于学习数据结构和算法,以及提高C语言编程能力都大有裨益。

    c语言,cJSON代码,内含例程

    C语言是一种广泛使用的编程语言,尤其在系统编程、嵌入式开发等领域有着深厚的根基。而cJSON是一个轻量级的库,专为C语言...通过阅读源码和运行示例,可以更深入地学习如何在实际项目中应用cJSON进行JSON数据的处理。

    c语言遍历文件夹

    通过上述解析可以看出,此C语言程序通过巧妙地利用标准库函数、结构体以及递归等技术手段,实现了对指定文件夹及其子文件夹下所有文本文件的有效遍历和处理。这对于文件管理系统的开发具有一定的参考价值。

    基于C语言解决中国象棋马的遍历问题【100012470】

    马的遍历问题):设计程序完成如下要求:在中国象棋棋盘上,对任一位置上放置的马,均能选择一个合适的路线,使得该棋子能按象棋的规则不重复地走过棋盘上的每一位置。 要求:依次输出所走过的各位置的坐标。最好能...

    二叉树的遍历_二叉树的遍历_

    这样,即使在非递归遍历时也可以方便地进行中序遍历。在构造线索二叉树时,需要遍历整个树,对每个节点进行线索化处理。 总结来说,二叉树遍历是理解和操作二叉树的基础,不同的遍历方法适用于不同的场景。熟练掌握...

    C语言二叉树建立遍历冒泡排序快速排序等.rar

    C++也支持模板和STL(标准模板库),提供了容器、算法和迭代器等工具,方便实现数据结构和算法。 7. **Delphi**:Delphi是基于Object Pascal的开发环境,主要用于Windows平台的桌面应用程序开发。它提供了丰富的...

    C语言中序线索化

    总之,中序线索化是二叉树非递归遍历的一种优化手段,通过在二叉链表节点中添加线索指针,使得在中序遍历过程中可以方便地进行双向移动。掌握这一技巧对于理解和处理复杂的数据结构问题至关重要。

    C语言 输入无向图连通图的顶点数、顶点信息、边数、顶点对序列及遍历的起始点序号,输出深度优先遍历序列。

    在遍历过程中,该算法会尽可能深地沿着每条路径前进,直到遇到一个死胡同(即所有相邻节点都已访问过)才返回并尝试其他路径。具体步骤如下: 1. **初始化**:创建一个栈来保存已访问的顶点,并用一个数组`visited...

    二叉链表模拟先序、中序、后序、层次遍历

    这样的设计使得二叉链表能够方便地进行多种遍历操作,如先序遍历、中序遍历、后序遍历和层次遍历。 **先序遍历** 是一种从根节点开始,然后访问左子树,最后访问右子树的遍历策略。在二叉链表中,先序遍历的顺序是...

    用C语言中的指针处理数据结构中的链表的方法.pdf

    例如,单链表的节点只包含一个指针域,而双链表的节点包含两个指针域,一个指向前一个节点,一个指向后一个节点,这样可以方便地进行双向遍历。循环链表的最后一个节点的指针指向头节点,形成一个环形结构,这使得它...

    二叉树的前序中序后序遍历代码

    这种方式可以方便地构建出任意形状的二叉树。 ```c void CreatBiTree(BiTree *T){ char ch; ch = getchar(); if(ch == '*'){ *T = NULL; } else { if(!(*T = (BiTree)malloc(sizeof(struct BiTNode)))){ ...

    xml文件遍历算法实现

    综上所述,libxml2库提供了一套完整的工具,帮助我们在C语言环境中有效地遍历XML文件。递归遍历简单直观,适合小规模文件;而非递归遍历则更适合大规模文件,能有效避免堆栈溢出问题。理解这两种遍历方式,并结合...

    二叉树的前序遍历

    ### 二叉树的前序遍历 #### 一、二叉树简介 ...通过递归调用,可以方便地实现各种遍历操作,为理解和应用二叉树打下坚实的基础。在实际编程中,可以根据具体需求调整遍历函数的实现细节,以满足不同的应用场景。

    万年历的程序-C语言

    虽然这是一个命令行程序,但也可以考虑提供简单的交互界面,让用户通过键盘输入来查询日期。可以使用getchar或fgets等函数获取用户输入,然后解析并执行相应的操作。 九、编译与调试 编写完成后,使用gcc编译器进行...

    C语言,java经典算法

    C语言中,可以使用指针直接遍历数组,而在Java中,可以利用ArrayList或LinkedList的API进行查找。 3. **图论算法**:如Dijkstra最短路径算法、Floyd-Warshall所有最短路径算法、Prim最小生成树算法和Kruskal最小...

Global site tag (gtag.js) - Google Analytics