C语言中链表的两种实现方式

C语言中链表的两种实现方式
C语言中链表的实现有很多种,但基本上可以分为两类。
一种是嵌入数据,一种是嵌入连接。下面分别用例子说明。

嵌入数据是指用户自定义数据,然后嵌入到统一的链表节点数据结构中。
见sd_list中的定义
struct __sd_list_iter {
    void*            data;
    struct __sd_list*        list;
    struct __sd_list_iter*    __next;
    struct __sd_list_iter*    __prev;
    int                __foreach;
};
其中的void* data用于指向用户数据结构(struct)。
再看apend操作
extern sd_list_iter_t* sd_list_apend(sd_list_t* a_this, void* a_data);
该操作会生成节点,并记录a_data;
其它操作请见log4c/sd代码目录。

嵌入连接是指用户定义数据结构,并通过相应的宏操作把上面代码中的next, prev添加到数据结构中。
最典型的要算bsd-list。
struct KeyValue {
    char * key;
    char * value;
    LIST_ENTRY(struct KeyValue) kv_link;
};
LIST_HEAD(kv_list_t, KeyValue_t);
其中key,value是用户数据。
LIST_ENTRY(struct KeyValue) kv_link就是嵌入的连接,展开之后便是
struct {                                /
    struct KeyValue *le_next;    /* next element */            /
    struct KeyValue **le_prev;    /* address of previous next element */    /
}kv_link
而LIST_HEAD(kv_list_t, KeyValue_t)则是定义了链表数据类型
struct kv_list_t {                                /
    KeyValue_t *lh_first;    /* first element */            /
}
使用的时候定义一个链表头
struct kv_list_t kvhead;
构建链表节点
KeyValue_t * kv = (KeyValue_t*) malloc(sizeof(KeyValue_t));
kv->key = strdup(key);
kv->value = strdup(value);
插入到链表头后面
LIST_INSERT_HEAD(&kvhead, kv, kv_link);
其它的操作请见bsd-list.h

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值