RT-thread 双链表说明

RT-thread 双链表说明

说双向链表之前先简单说下单链表

单链表结点结构

数据域引用域
datanext
  • data:把存储据元素本身信息的域叫结点的数据域
  • next:存储与它相邻的数据元素的存储地址信息的域叫结点的引用域

线性表(a 1 ,a 2 ,a 3 ,a 4 ,a 5 ,a 6 )对应的链式存储结构示意图。

  • 头引用地址为800H
    | 存储地址 | data | next |
    | :—: | :—: | :----😐
    | 909 | a4 | 600 |
    | 900 | a2 | 709 |
    | 600 | a5 | NULL |
    | 800 | a1 | 900 |
    | 709 | a3 | 909 |

双向链表结点的定义与单链表的结点的定义很相似,只是双向链表多了一个字段 prev。

双向链表结点结构

引用域数据域引用域
prevdatanext
  • prev:保存直接前驱结点的地址
  • data:把存储据元素本身信息的域叫结点的数据域
  • next:保存直接后继结点的地址
prev存储地址datanext
709909a4600
800900a2709
900600a5600
800800a1900
900709a3909

双向链表的定义

struct rt_list_node
{
    struct rt_list_node *next; /**< point to next node. */
    struct rt_list_node *prev; /**< point to prev node. */
};
typedef struct rt_list_node rt_list_t; /**< Type for lists. */

链表初始化

  • 将前后引用域都指向同一个地址
rt_inline void rt_list_init(rt_list_t *l)
{
    l->next = l->prev = l;
}

双向链表后插入


/**
 * @brief insert a node after a list
 *
 * @param l list to insert it
 * @param n new node to be inserted
 */
rt_inline void rt_list_insert_after(rt_list_t *l, rt_list_t *n)  
{  
    l->next->prev = n; //(1)  
    n->next = l->next; //(2)
    l->next = n;       //(3)
    n->prev = l;       //(4)
}
  • 图示
    双向链表后插入

双向链表前插入

/**
 * @brief insert a node before a list
 *
 * @param n new node to be inserted
 * @param l list to insert it
 */
rt_inline void rt_list_insert_before(rt_list_t *l, rt_list_t *n)
{
    l->prev->next = n;  //(1)
    n->prev = l->prev; //(2)

    l->prev = n;           //(3)
    n->next = l;           //(4)
}
  • 图示
    双向链表前插入
    按评论说这个图的箭头反了,实际也确实方向反了,找不到原图了,大家忽略方向吧,抱歉。

移除链表n结点

/**
 * @brief remove node from list.
 * @param n the node to remove from the list.
 */
rt_inline void rt_list_remove(rt_list_t *n)
{
    n->next->prev = n->prev;
    n->prev->next = n->next;

    n->next = n->prev = n;
}
  • 图示
    双向链表移除某个结点

检查是否为空链表

/**
 * @brief tests whether a list is empty
 * @param l the list to test.
 */
rt_inline int rt_list_isempty(const rt_list_t *l)
{
    return l->next == l;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值