Maxipy/openmv源码分析--list_t

openmv中用到很多结构体list_t,通过对于这个结构体的实现,可以方便对于数据的处理。

在collections.h中定义的相关结构体和功能函数声明。

//
// list //
//

typedef struct list_lnk
{
    struct list_lnk *next_ptr, *prev_ptr;
    char data[];
}
__attribute__((aligned(8)))list_lnk_t;

typedef struct list
{
    list_lnk_t *head_ptr, *tail_ptr;
    size_t size, data_len;
}
__attribute__((aligned(8)))list_t;

void list_init(list_t *ptr, size_t data_len);
void list_copy(list_t *dst, list_t *src);
void list_free(list_t *ptr);
void list_clear(list_t *ptr);
size_t list_size(list_t *ptr);
void list_push_front(list_t *ptr, void *data);
void list_push_back(list_t *ptr, void *data);
void list_pop_front(list_t *ptr, void *data);
void list_pop_back(list_t *ptr, void *data);
void list_get_front(list_t *ptr, void *data);
void list_get_back(list_t *ptr, void *data);
void list_set_front(list_t *ptr, void *data);
void list_set_back(list_t *ptr, void *data);
void list_insert(list_t *ptr, void *data, size_t index);
void list_remove(list_t *ptr, void *data, size_t index);
void list_get(list_t *ptr, void *data, size_t index);
void list_set(list_t *ptr, void *data, size_t index);

结构体list_t是头结点。这样就可以容纳不同的数据类型。通过连接list_lnk_t。所以所有函数用list_t充当形参。

这里的链表是一个双向循环的链表,这里要注意头结点指向的第一个节点没有指向头结点。

 

1、void list_init(list_t *ptr, size_t data_len)

void list_init(list_t *ptr, size_t data_len)
{
    ptr->head_ptr = NULL;
    ptr->tail_ptr = NULL;
    ptr->size = 0;
    ptr->data_len = data_len;
}

这个函数主要是初始化list_t 的结构体。其中关于其中的参数data_len用于指示后续的节点的数据的内存申请长度。

 

2、void list_copy(list_t *dst, list_t *src);

void list_copy(list_t *dst, list_t *src)
{
    memcpy(dst, src, sizeof(list_t));
}

这里就是利用memcpy做简单的内存复制。

3、void list_free(list_t *ptr)

void list_free(list_t *ptr)
{
    for (list_lnk_t *i = ptr->head_ptr; i; )//获取到ptr的头结点
     {
        list_lnk_t *j = i->next_ptr;        //获取当前节点的下一个节点 
        xfree(i);                           //释放当前节点
        i = j;                              //更新当前节点
    }
}

这个函数就如函数里面的注释,主要就是遍寻一遍链表,释放节点内存。

<
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值