4G_module/include/platform/cm_linklist.h

212 lines
5.2 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file cm_linklist.h
* @brief 双端链表实现
* @copyright copyright © 2021 China Mobile IOT. All rights reserved.
* @author by ZXW
* @date 2021/4/28
* @date 2021/6/29,增加互斥锁(降低锁的粒度),by zxw
*/
#ifndef __CM_LINKLIST_H__
#define __CM_LINKLIST_H__
/** 双端链表元素定义*/
typedef struct _linklist_element_t
{
void* content; /*!< 节点内容*/
int size; /*!< content长度*/
struct _linklist_element_t* pre; /*!< 前驱节点*/
struct _linklist_element_t* next; /*!< 后继节点*/
} linklist_element_t;
/** 双端链表结构定义*/
typedef struct {
linklist_element_t* head; /*!< 表头*/
linklist_element_t* tail; /*!< 表尾*/
int count; /*!< 节点个数*/
int size; /*!< 链表占用内存*/
void* mutex; /*!< 互斥锁,用于多线程时链表数据同步*/
} linklist_t;
/**
* \brief 链表节点content比较方法
*
* \param [in] src_content 源content
* \param [in] dst_content 目标content
* \return 相等返回0不相等返回其他值
*
* \details More details
*/
typedef int (*linklist_content_compare)(void* src_content, void* dst_content);
/**
* \brief 创建一个空的双端链表
*
* \return 返回双端链表指针
*
* \details More details
*/
linklist_t* linklist_create(void);
/**
* \brief 在表尾添加一个节点
*
* \param [in] list 链表
* \param [in] content 节点内容
* \param [in] size 节点长度
* \return 返回当前节点
*
* \details More details
*/
linklist_element_t* linklist_append_to_tail(linklist_t* list, void* content, int size);
/**
* \brief 在表头添加一个节点
*
* \param [in] list 链表
* \param [in] content 节点内容
* \param [in] size 节点长度
* \return 返回当前节点
*
* \details More details
*/
linklist_element_t* linklist_append_to_head(linklist_t* list, void* content, int size);
/**
* \brief 在index节点前插入一个节点
*
* \param [in] list 链表
* \param [in] index 被插入节点
* \param [in] content 节点内容
* \param [in] size 节点长度
* \return 返回当前节点
*
* \details More details
*/
linklist_element_t* linklist_insert_before_index(linklist_t* list, linklist_element_t* index, void* content, int size);
/**
* \brief 在index节点后插入一个节点
*
* \param [in] list 链表
* \param [in] index 被插入节点
* \param [in] content 节点内容
* \param [in] size 节点长度
* \return 返回当前节点
*
* \details More details
*/
linklist_element_t* linklist_insert_after_index(linklist_t* list, linklist_element_t* index, void* content, int size);
/**
* \brief 移除表头节点
*
* \param [in] list 链表
* \return 成功返回0失败返回-1
*
* \details More details
*/
int linklist_remove_head(linklist_t* list);
/**
* \brief 移除表尾节点
*
* \param [in] list 链表
* \return 成功返回0失败返回-1
*
* \details More details
*/
int linklist_remove_tail(linklist_t* list);
/**
* \brief 取出表头节点内容,不释放内存
*
* \param [in] list 链表
* \return 成功返回content失败返回NULL
*
* \details More details
*/
void* linklist_pop_head(linklist_t* list);
/**
* \brief 取出表尾节点内容,不释放内存
*
* \param [in] list 链表
* \return 成功返回content失败返回NULL
*
* \details More details
*/
void* linklist_pop_tail(linklist_t* list);
/**
* \brief 删除content对应的节点
*
* \param [in] list 链表
* \param [in] content 节点内容
* \param [in] cb 节点比较方法
* \return 成功返回0失败返回-1
*
* \details More details
*/
int linklist_remove_content(linklist_t* list, void* content, linklist_content_compare cb);
/**
* \brief 删除节点
*
* \param [in] list 链表
* \param [in] element 节点
* \return 成功返回0失败返回-1
*
* \details More details
*/
int linklist_remove_element(linklist_t* list, linklist_element_t* element);
/**
* \brief 正向迭代
*
* \param [in] list 链表
* \param [in] pos 当前位置
* \return 下一个节点
*
* \details 起始pos传入NULL从表头迭代
*/
linklist_element_t* linklist_next_element(linklist_t* list, linklist_element_t** pos);
/**
* \brief 反向迭代
*
* \param [in] list 链表
* \param [in] pos 当前位置
* \return 前一个节点
*
* \details 起始pos传入NULL从表尾迭代
*/
linklist_element_t* linklist_pre_element(linklist_t* list, linklist_element_t** pos);
/**
* \brief 根据content查找对应的节点
*
* \param [in] list 链表
* \param [in] content 节点内容
* \param [in] cb 节点比较方法
* \return 成功返回0失败返回-1
*
* \details More details
*/
linklist_element_t* linklist_find_element(linklist_t* list, void* content, linklist_content_compare cb);
/**
* \brief 销毁链表
*
* \param [in] list 链表
* \return None
*
* \details 销毁后链表将置为NULL
*/
void linklist_destroy(linklist_t** list);
#endif