浅析 Linux 链表实现(2)

192 阅读2分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

介绍一个类似Linux的链表实现,和 Linux 的实现对比。

TBOX 中的 list_entry

元素在外部维护的双向链表。

类似Linux的链表结构,链表容器本身不存储元素,不开辟内存空间,仅仅是一个节点头,这样比较节省内存,更加灵活。(尤其是在多个链表间元素迁移的时候,或者多个链表需要统一内存池维护的时候)。

存储方式

/*! the doubly-linked list entry type
 *
 * <pre>
 * list: list => ... => last
 *        |               |
 *        <---------------
 *
 * </pre>
 */
typedef struct __tb_list_entry_t
{
    /// the next entry
    struct __tb_list_entry_t*   next;

    /// the prev entry
    struct __tb_list_entry_t*   prev;

}tb_list_entry_t, *tb_list_entry_ref_t;

/// the list entry head type
typedef struct __tb_list_entry_head_t
{
    /// the next entry
    struct __tb_list_entry_t*   next;

    /// the prev entry
    struct __tb_list_entry_t*   prev;

    /// the list size
    tb_size_t                   size;

    /// the iterator
    tb_iterator_t               itor;

    /// the entry offset
    tb_size_t                   eoff;

    /// the entry copy func
    tb_entry_copy_t             copy;

}tb_list_entry_head_t, *tb_list_entry_head_ref_t;

tb_list_entry_init

// 初始化链表,需要指定外置元素的结构体类型,链表的节点名字
tb_list_entry_head_t list;
#define tb_list_entry_init(list, type, entry, copy)     tb_list_entry_init_(list, tb_offsetof(type, entry), sizeof(type), copy)

初始化链表,需要指定外置元素的结构体类型,链表的节点名字

参数说明

  • list:指定链表
  • type:外置元素的结构
  • entry:链表的节点名字
  • copy:the entry copy func

list_entry_exit

void list_entry_exit(list_entry_head_ref_t list);

销毁双链表

tb_list_entry_clear

static __tb_inline__ tb_void_t              tb_list_entry_clear(tb_list_entry_head_ref_t list)

清除双链表

tb_list_entry_head

static __tb_inline__ tb_list_entry_ref_t    tb_list_entry_head(tb_list_entry_head_ref_t list)

返回头结点

tb_list_entry_last

static __tb_inline__ tb_list_entry_ref_t    tb_list_entry_last(tb_list_entry_head_ref_t list)

返回尾结点

tb_list_entry_insert_prev

static __tb_inline__ tb_void_t              tb_list_entry_insert_prev(tb_list_entry_head_ref_t list, tb_list_entry_ref_t node, tb_list_entry_ref_t entry)

插入上一项

tb_list_entry_insert_next

static __tb_inline__ tb_void_t              tb_list_entry_insert_next(tb_list_entry_head_ref_t list, tb_list_entry_ref_t node, tb_list_entry_ref_t entry)

在之前新的元素后面插入一个新元素

tb_list_entry_insert_head

static __tb_inline__ tb_void_t              tb_list_entry_insert_head(tb_list_entry_head_ref_t list, tb_list_entry_ref_t entry)

在链表头部插入元素,并返回新元素的迭代器索引。

tb_list_entry_insert_tail

static __tb_inline__ tb_void_t              tb_list_entry_insert_tail(tb_list_entry_head_ref_t list, tb_list_entry_ref_t entry)

链表尾部插入元素

注意:所有操作都是在外置结构体中的list_entry节点上操作

tb_list_entry_replace

static __tb_inline__ tb_void_t              tb_list_entry_replace(tb_list_entry_head_ref_t list, tb_list_entry_ref_t node, tb_list_entry_ref_t entry)

替换该项

tb_list_entry_replace_head

static __tb_inline__ tb_void_t              tb_list_entry_replace_head(tb_list_entry_head_ref_t list, tb_list_entry_ref_t entry)

替换头节点

tb_list_entry_replace_last

static __tb_inline__ tb_void_t              tb_list_entry_replace_last(tb_list_entry_head_ref_t list, tb_list_entry_ref_t entry)

替换尾节点

tb_list_entry_remove

static __tb_inline__ tb_void_t              tb_list_entry_remove(tb_list_entry_head_ref_t list, tb_list_entry_ref_t entry)

移除指定的元素

tb_list_entry_remove_next

tb_list_entry_remove_prev

tb_list_entry_remove_head

tb_list_entry_remove_last

static __tb_inline__ tb_void_t              tb_list_entry_remove_prev(tb_list_entry_head_ref_t list, tb_list_entry_ref_t next)

static __tb_inline__ tb_void_t              tb_list_entry_remove_head(tb_list_entry_head_ref_t list)

static __tb_inline__ tb_void_t              tb_list_entry_remove_last(tb_list_entry_head_ref_t list)

移除元素

tb_list_entry_moveto_prev

static __tb_inline__ tb_void_t              tb_list_entry_moveto_prev(tb_list_entry_head_ref_t list, tb_list_entry_ref_t node, tb_list_entry_ref_t entry)

移到上一项

tb_list_entry_moveto_next

static __tb_inline__ tb_void_t              tb_list_entry_moveto_next(tb_list_entry_head_ref_t list, tb_list_entry_ref_t node, tb_list_entry_ref_t entry)

移到下一项

tb_list_entry_moveto_head

static __tb_inline__ tb_void_t              tb_list_entry_moveto_head(tb_list_entry_head_ref_t list, tb_list_entry_ref_t entry)

移到头节点

tb_list_entry_moveto_tail

static __tb_inline__ tb_void_t              tb_list_entry_moveto_tail(tb_list_entry_head_ref_t list, tb_list_entry_ref_t entry)

移到尾节点

tb_list_entry

#define tb_list_entry(head, entry)      ((((tb_byte_t*)(entry)) - (head)->eoff))

访问具体某个节点的元素数据

tb_for_all_if

tb_for_all_if(type, item, iterator, cond)

如果条件符合,则使用迭代器遍历所有元素

hash_map

存储方式:

typedef struct __tb_hash_map_item_t
{
    /// the item name
    tb_pointer_t        name;

    /// the item data
    tb_pointer_t        data;

}tb_hash_map_item_t, *tb_hash_map_item_ref_t;

使用场景:

  • 哈希表

tb_hash_map_init

tb_hash_map_ref_t       tb_hash_map_init(tb_size_t bucket_size, tb_element_t element_name, tb_element_t element_data);

初始化哈希表

tb_hash_map_exit

tb_void_t               tb_hash_map_exit(tb_hash_map_ref_t hash_map);

退出哈希表

tb_hash_map_clear

tb_void_t               tb_hash_map_clear(tb_hash_map_ref_t hash_map);

清理哈希表

tb_hash_map_get

tb_pointer_t            tb_hash_map_get(tb_hash_map_ref_t hash_map, tb_cpointer_t name);

获取哈希表值

tb_hash_map_find

tb_size_t               tb_hash_map_find(tb_hash_map_ref_t hash_map, tb_cpointer_t name);

通过名称查找项目

tb_hash_map_insert

tb_size_t               tb_hash_map_insert(tb_hash_map_ref_t hash_map, tb_cpointer_t name, tb_cpointer_t data);

通过名称插入项目数据

tb_hash_map_remove

tb_void_t               tb_hash_map_remove(tb_hash_map_ref_t hash_map, tb_cpointer_t name);

通过名称中删除项

tb_hash_map_size

tb_size_t               tb_hash_map_size(tb_hash_map_ref_t hash_map);

返回容器容量

tb_hash_map_init

tb_size_t               tb_hash_map_maxn(tb_hash_map_ref_t hash_map);

返回容器最大容量