免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3654 | 回复: 11
打印 上一主题 下一主题

[函数] 类型无关的链表释放函数for高峰. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-17 09:11 |只看该作者 |倒序浏览
#include <stdio.h>
#include <stdlib.h>

#define offsetof(type, field)        ((long) &((type *)0)->field)

void freeList(void *link, long nextPos);

typedef struct List1 {
        int data;
        struct List1 *next;
} List1;

typedef struct List2 {
        int data;
        int data2;
        struct List2 *next;
        int data3;
} List2;

typedef struct Template {
        int data;
} Template;

int main()
{
        List1 a1, a2, a3;
        List2 b1, b2;

        List1 *headA = &a1;
        List2 *headB = &b1;

        a1.data = 1;
        a1.next = &a2;
        a2.data = 2;
        a2.next = &a3;
        a3.data = 3;
        a3.next = NULL;

        b1.data = b1.data2 = b1.data3 = 10;
        b1.next = &b2;
        b2.data = b2.data2 = b2.data3 = 15;
        b2.next = NULL;

        freeList((void *) headA, offsetof(List1, next));
        freeList((void *) headB, offsetof(List2, next));

        return 0;
}

void freeList(void *link, long nodePos)
{
        void *nextNode;

        if (link == NULL)
                return ;

        while (link)
        {
                /* make nextNode pointer point to next Node in the List */
                nextNode = (void *) (*((char **) (link + nodePos)));

                /* free(link); */
                /* print first element in Node */
                if (nextNode)

                        printf("%p::%d\n", (nextNode),

                               ((Template *)nextNode)->data);
                else
                        printf("%p::NULL\n", (nextNode));

                link = nextNode;
        }
}



这个代码很垃圾, 只是在上次你的基础上, 我扩展了, 只要一个链表的节点是一致的, 或者说, 只要该链表中next指针在结构体中的偏移是固定的(用宏offsetof计算), 就能正确进行遍历.

昨天讨论的指针问题, 也算给我平反了 ^^

更好的链表实现, 我见过的是postgresql中的, 不过具体比较复杂(我只潦草看了下).

论坛徽章:
0
2 [报告]
发表于 2007-08-17 09:18 |只看该作者
呵呵,这个问题有点扰,刚开始我没有懂你的意思,直到版主举列说明了一下,才恍然大悟。

你这个代码我再看看。

论坛徽章:
0
3 [报告]
发表于 2007-08-17 09:29 |只看该作者
你的代码是没有问题的,只是感觉void freeList(void *link, long nodePos)中的nodePos参数的传入有点别扭。调用者很容易错误地传其他值。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2007-08-17 09:32 |只看该作者
我觉得用宏就挺好的。
把结构体的名字和 next 指针的名字传过去,
就完事儿了。

论坛徽章:
0
5 [报告]
发表于 2007-08-17 09:34 |只看该作者
原帖由 高峰 于 2007-8-17 09:29 发表
你的代码是没有问题的,只是感觉void freeList(void *link, long nodePos)中的nodePos参数的传入有点别扭。调用者很容易错误地传其他值。


呵呵, 链表开始设计时候, 如果抽象好, 就不需要写这种无奈的代码了...^^

传偏移好处就是不要求每个结构体最后的元素是next.

因为c语言会有结构体使用:
typedef struct Test {
    someType  type;
    struct Test *next;
    char            bur[];
} Test;

论坛徽章:
0
6 [报告]
发表于 2007-08-17 09:36 |只看该作者
我觉得没有必要让调用者知道你的链表“长什么样子”,指向next是___next还是__NEXT....
强烈要求高峰同学实现成c库树的样子。供大家使用。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2007-08-17 09:48 |只看该作者
建议用 list.h

论坛徽章:
0
8 [报告]
发表于 2007-08-17 09:52 |只看该作者
c库树的样子,是什么样子啊?
书读得太少了。
有没有资料,我看看

TO Edengundam ,在我的工作中,链表的确没有抽象好,都是前辈们的设计模式。改动风险大大的。

论坛徽章:
0
9 [报告]
发表于 2007-08-17 10:01 |只看该作者
原帖由 高峰 于 2007-8-17 09:52 发表
c库树的样子,是什么样子啊?
书读得太少了。
有没有资料,我看看

TO Edengundam ,在我的工作中,链表的确没有抽象好,都是前辈们的设计模式。改动风险大大的。



这种就是没办法的事情了...呵呵

论坛徽章:
0
10 [报告]
发表于 2007-08-17 10:02 |只看该作者
原帖由 flw 于 2007-8-17 09:48 发表
建议用 list.h



哪里下的?是不是标准的啊?
HP-UX下查找的list.h,只有在../Xm下有
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP