我们阅读一下contiki的源码,list.c(路径是./core/lib/list.h).

#include "lib/list.h"#define NULL 0struct list {struct list *next;
};

这就是核心结构体了,发现了吗?没有数据域,成员就是一个指针。其实这个有点类似Linux里面的链表,对,就是嵌入在结构体里面的那个list.我们继续往下看。

void
list_init(list_t list)
{*list = NULL;
}

初始化函数,这里要说明的是,list_t 就是void**类型。

在头文件中,有这样的定义:

#define LIST_CONCAT2(s1, s2) s1##s2
#define LIST_CONCAT(s1, s2) LIST_CONCAT2(s1, s2)
#define LIST(name) \static void *LIST_CONCAT(name,_list) = NULL; \static list_t name = (list_t)&LIST_CONCAT(name,_list)

其实就是定义一个链表(假设name是hello).   有个变量叫hello_list, 其实是一个void*类型的指针,初始化为NULL,这个链表的名字叫hello, hello是指向hello_list的二级指针。

这里的list是没有头节点的,*hello就得到了第一个元素。因为每个元素都是指针,那么初始化的时候,第一个元素自然为NULL了,表示链表为空。

void *
list_head(list_t list)
{return *list;
}

返回链表的第一个元素。

void *
list_tail(list_t list)
{struct list *l;if(*list == NULL) {return NULL;}for(l = *list; l->next != NULL; l = l->next);return l;
}

返回链表的最后一个元素。

void
list_remove(list_t list, void *item)
{struct list *l, *r;if(*list == NULL) {return;}r = NULL;//r用来保存前一个元素for(l = *list; l != NULL; l = l->next) {if(l == item) {if(r == NULL) {//说明要删除的元素恰好是第一个/* First on list */*list = l->next;} else {/* Not first on list */r->next = l->next;}l->next = NULL;return;}r = l;}
}

删除某个元素。(千万要记住,这个链表的元素就是指针!)

void
list_add(list_t list, void *item)
{struct list *l;/* Make sure not to add the same element twice */list_remove(list, item);((struct list *)item)->next = NULL;l = list_tail(list);//得到最后一个元素if(l == NULL) {*list = item;} else {l->next = item;}
}

把元素追加到末尾。

void
list_push(list_t list, void *item)
{/* Make sure not to add the same element twice */list_remove(list, item);((struct list *)item)->next = *list;*list = item;
}

头插元素。

void *
list_chop(list_t list)
{struct list *l, *r;if(*list == NULL) {return NULL;}if(((struct list *)*list)->next == NULL) {//说明只有一个元素l = *list;*list = NULL;return l;}for(l = *list; l->next->next != NULL; l = l->next);//查找到倒数第二个元素r = l->next;l->next = NULL;return r;
}

”弹出“最末尾的一个元素。

void *
list_pop(list_t list)
{struct list *l;l = *list;if(*list != NULL) {*list = ((struct list *)*list)->next;}return l;
}

“弹出”第一个元素。

其他函数代码都很简单,我们不再赘述。

有的朋友不禁要问了,这样的一个链表,怎么用呢?答案下次揭晓,下次我们结合内存管理,举例说明这个链表的用法。

contiki源码阅读之list相关推荐

  1. contiki源码阅读之mmem.c

    上次我们说了list,这次我们就借着mmem.c的代码来用一下这个链表. 代码目录是./core/lib/mmem.c 结构体定义如下 struct mmem {struct mmem *next;u ...

  2. 应用监控CAT之cat-client源码阅读(一)

    CAT 由大众点评开发的,基于 Java 的实时应用监控平台,包括实时应用监控,业务监控.对于及时发现线上问题非常有用.(不知道大家有没有在用) 应用自然是最初级的,用完之后,还想了解下其背后的原理, ...

  3. centos下将vim配置为强大的源码阅读器

    每日杂事缠身,让自己在不断得烦扰之后终于有了自己的清静时光来熟悉一下我的工具,每次熟悉源码都需要先在windows端改好,拖到linux端,再编译.出现问题,还得重新回到windows端,这个过程太耗 ...

  4. 源码阅读:AFNetworking(十六)——UIWebView+AFNetworking

    该文章阅读的AFNetworking的版本为3.2.0. 这个分类提供了对请求周期进行控制的方法,包括进度监控.成功和失败的回调. 1.接口文件 1.1.属性 /**网络会话管理者对象*/ @prop ...

  5. 源码阅读:SDWebImage(六)——SDWebImageCoderHelper

    该文章阅读的SDWebImage的版本为4.3.3. 这个类提供了四个方法,这四个方法可分为两类,一类是动图处理,一类是图像方向处理. 1.私有函数 先来看一下这个类里的两个函数 /**这个函数是计算 ...

  6. mybatis源码阅读

    说下mybatis执行一个sql语句的流程 执行语句,事务等SqlSession都交给了excutor,excutor又委托给statementHandler SimpleExecutor:每执行一次 ...

  7. 24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment

    24 UsageEnvironment使用环境抽象基类--Live555源码阅读(三)UsageEnvironment 24 UsageEnvironment使用环境抽象基类--Live555源码阅读 ...

  8. Transformers包tokenizer.encode()方法源码阅读笔记

    Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode

  9. 源码阅读笔记 BiLSTM+CRF做NER任务 流程图

    源码阅读笔记 BiLSTM+CRF做NER任务(二) 源码地址:https://github.com/ZhixiuYe/NER-pytorch 本篇正式进入源码的阅读,按照流程顺序,一一解剖. 一.流 ...

最新文章

  1. 腾讯云工业互联网助力平台发布 推动制造业“数字化”蝶变
  2. 基础才是重中之重~DictionaryK,V里V的设计决定的性能
  3. Oracle date 和 timestamp 区别
  4. 59. Spiral Matrix II ***
  5. Eclipse Outline图标
  6. 计算机学院寝室文明风景线活动,小猿关注 | 营造良好学风 打造和谐宿舍 ——计算机学院开展学风主题教育暨文明宿舍评选活动...
  7. Spring AOP 底层原理_001----AspectJ与CGLIB介绍
  8. oracle时间间隔分钟数,如何掌握Oracle 中的时间间隔型数据
  9. 40个极简WordPress主题
  10. 文本文件 java_Java入门:读写文本文件
  11. 你真的会用搜索引擎吗
  12. 北京单身狗都去哪儿了
  13. Java交换二叉树的左右子树_二叉树左右子树交换
  14. 如何让女朋友说Yes I Do,数据分析助力客户管理秘籍
  15. 微信实时给服务器发送gps位置,你知道吗?微信聊天发原图暴露你的位置信息
  16. 20189215 2018-2019-2 《密码与安全新技术专题》第11周作业
  17. 随笔——雪雁飞过马赛克群导
  18. 带你玩转Github
  19. linux提交任务执行时间,Linux之任务计划
  20. matlab 脱离mcr,MATLAB生成exe脱离matlab运行可执行程序

热门文章

  1. CountDownLatch 初识
  2. python-IO多路复用,select模块
  3. scrapy-redis使用以及剖析
  4. 启用不安全的HTTP方法解决方案
  5. Eclipse 3.7 3.x SWT/Jface 开发环境搭建
  6. 今天在cnblog开博啦
  7. 设置span的宽度,让span象button那样显示
  8. summary+plan
  9. lstm网络python代码实现
  10. 莱斯分布概率分布曲线