1. 四个操作接口
/**
* 遍历链表,每个节点的数据打印
*/
void list_queue_printf(list_queue_t *p_list_head);
/**
* 索引头部偏移的节点,返回指定节点的指针
*/
list_queue_t *list_queue_indexof(list_queue_t *p_list_head, uint16_t node_index);
/**
* 删除指定索引的节点
*/
list_queue_t* list_queue_remove_node(list_queue_t *p_list_head, uint16_t node_index);
/**
* 添加节点,新节点追加到头部,按照添加顺序排序
*/
list_queue_t *list_queue_add_node(list_queue_t *p_list_head, uint8_t *p_data, uint16_t length);
2. 环形链表结构体
typedef struct list_node
{
struct list_node* p_next_node ;
struct list_node* p_prev_node ;
uint16_t data_length;
uint8_t p_data[0];
}list_queue_t;
3. 环形链表的接口实现
list_queue_t *list_queue_add_node(list_queue_t *p_list_head, uint8_t *p_data, uint16_t length)
{
if (p_data == NULL)
{
return p_list_head;
}
if (p_list_head == NULL)
{
p_list_head = os_mem_alloc(RAM_TYPE, sizeof(list_queue_t) + length);
if (p_list_head == NULL)
{
return NULL;
}
p_list_head->data_length = length;
memcpy(p_list_head->p_data, p_data, length);
p_list_head->p_next_node = p_list_head;
p_list_head->p_prev_node = p_list_head;
// p_list_head =
}
else
{
list_queue_t *p_node = os_mem_alloc(RAM_TYPE, sizeof(list_queue_t) + length);
if (p_node == NULL)
{
return p_list_head;
}
p_node->data_length = length;
memcpy(p_node->p_data, p_data, length);
p_node->p_prev_node = p_list_head->p_prev_node;
p_node->p_next_node = p_list_head;
p_node->p_prev_node->p_next_node = p_node;
p_node->p_next_node->p_prev_node = p_node;
p_list_head = p_node;
}
return p_list_head;
}
list_queue_t *list_queue_remove_node(list_queue_t *p_list_head, uint16_t node_index)
{
if (p_list_head == NULL)
{
return NULL;
}
list_queue_t *p_target_node = NULL;
if (node_index == 0)
{
if (p_list_head->p_next_node == p_list_head)
{
os_mem_free(p_list_head);
p_list_head = NULL;
return NULL;
}
else
{
p_target_node = p_list_head;
p_list_head = p_list_head->p_next_node;
p_target_node->p_next_node->p_prev_node = p_target_node->p_prev_node;
p_target_node->p_prev_node->p_next_node = p_target_node->p_next_node;
os_mem_free(p_target_node);
p_target_node = NULL;
return p_list_head;
}
}
uint16_t index = 0;
for (list_queue_t *p_iterator = p_list_head;; p_iterator = p_iterator->p_next_node)
{
if (index == node_index)
{
p_target_node = p_iterator;
break;
}
if (p_iterator->p_next_node == p_list_head)
{
return p_list_head;
}
index++;
}
if (p_target_node != NULL)
{
p_target_node->p_next_node->p_prev_node = p_target_node->p_prev_node;
p_target_node->p_prev_node->p_next_node = p_target_node->p_next_node;
os_mem_free(p_target_node);
p_target_node = NULL;
}
return p_list_head;
}
list_queue_t *list_queue_indexof(list_queue_t *p_list_head, uint16_t node_index)
{
if (p_list_head == NULL)
return NULL;
uint16_t index = 0;
list_queue_t *p_iterator = NULL;
for (p_iterator = p_list_head;; p_iterator = p_iterator->p_next_node)
{
if (index == node_index)
{
return p_iterator;
}
if (p_iterator->p_next_node == p_list_head)
{
return NULL;
}
index++;
}
return NULL;
}
void list_queue_printf(list_queue_t *p_list_head)
{
if (p_list_head == NULL)
{
APP_PRINT_INFO0("[list] queue is null!");
return;
}
uint16_t index = 0;
for (list_queue_t *p_iterator = p_list_head;; p_iterator = p_iterator->p_next_node)
{
APP_PRINT_INFO2("[list] queue index %d, data %b", index, TRACE_BINARY(p_iterator->data_length, p_iterator->p_data));
if (p_iterator->p_next_node == p_list_head)
{
return;
}
index++;
}
}
4. 使用方法
list_queue_t * g_head_list= NULL;
uint8_t * str0 = "12345678!";
uint8_t * str1 = "abcdefghi!";
g_head_list = list_queue_add_node(p_head_list, str0, strlen(str0));
g_head_list = list_queue_add_node(p_head_list, str1, strlen(str1));
list_queue_printf(p_head_list);

结束!