您的位置:首页 > 其它

NuttX_基础组件之队列

2016-04-10 13:14 411 查看
flink - forward link

blink - backward link

/nuttx/include/queue.h

/nuttx/libc/queue/ 文件夹下c文件实现

sigle list queue

单向链表队列:

1. 单向链表队列结构体中记录了first node的地址 head 和 last node的地址 tail

2. 队列空时, head tail 指针等于NULL

3. 最后一个节点 last node, 向前遍历flink指针等于NULL

struct sq_entry_s
{
struct sq_entry_s *flink; /* forward  */
};
typedef struct sq_entry_s sq_entry_t;

struct sq_queue_s
{
sq_entry_t *head;        /* queue head(first) node */
sq_entry_t *tail;        /* queue tail(last)  node */
};
typedef struct sq_queue_s  sq_queue_t;

void sq_addfirst(sq_entry_t *node, sq_queue_t *queue);
void sq_addlast(sq_entry_t *node, sq_queue_t *queue);
void sq_addafter(sq_entry_t *prev, sq_entry_t *node, sq_queue_t *queue);

sq_entry_t *sq_remfirst(sq_queue_t *queue);
sq_entry_t *sq_remlast(sq_queue_t *queue);
sq_entry_t *sq_remafter(sq_entry_t *node, sq_queue_t *queue);
void sq_rem(sq_entry_t *node, sq_queue_t *queue);

--> flink

+------------------------------------------------sigle list queue head
|
+
+--------+--------+~~~~~~~~~+--------+--------+------+
|  first |        |         |        |  last  |      |
|  node  |  node  | ~~~~~~~ |  node  |  node  | NULL |
|    +-->|    +-->|    +--->|    +-->|    +-->|      |
+--------+--------+~~~~~~~~~+--------+--------+------+
+
|
+----------sigle list queue tail


doule list queue

双向链表队列:

1. 双向链表队列结构体中记录了first node的地址 head 和 last node的地址 tail

2. 队列空时, head tail 指针等于NULL

3. 最前一个节点first node, 向后遍历blink指针等于NULL

4. 最后一个节点last node, 向前遍历flink指针等于NULL

struct dq_entry_s
{
FAR struct dq_entry_s *flink;
FAR struct dq_entry_s *blink;
};
typedef struct dq_entry_s dq_entry_t;

struct dq_queue_s
{
dq_entry_t *head; /* queue head(first) node */
dq_entry_t *tail; /* queue tail(last)  node */
};
typedef struct dq_queue_s dq_queue_t;

void dq_addfirst(dq_entry_t *node, dq_queue_t *queue);
void dq_addlast(dq_entry_t *node, dq_queue_t *queue);
void dq_addafter(dq_entry_t *prev, dq_entry_t *node, dq_queue_t *queue);
void dq_addbefore(dq_entry_t *next, dq_entry_t *node, dq_queue_t *queue);

dq_entry_t *dq_remfirst(dq_queue_t *queue);
dq_entry_t *dq_remlast(dq_queue_t *queue);
void dq_rem(dq_entry_t *node, dq_queue_t *queue);

--> flink
<-- blink

+----------------------------------------------doule list queue head
|
+
+------+--------+--------+~~~~~~~~~+--------+--------+------+
|      |  first |        |         |        |  last  |      |
| NULL |  node  |  node  | ~~~~~~~ |  node  |  node  | NULL |
|      |<--+    |<--+    |<--+     |<--+    |<--+    |      |
|      |    +-->|    +-->|     +-->|    +-->|    +-->|      |
+------+--------+--------+~~~~~~~~~+--------+--------+------+
+
|
+-------doule list queue tail
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: