链表?在平时写程序的时候用的并不多,但在操作系统里面使用的非常多。链表就好比一个圆形的晾衣架。。。
链表分为单向链表和双向链表,单向链表很少用,使用最多的还是双向链表。
链表是通过节点把离散的数据链接成一个表,通过对节点的插入和删除操作从而实现对数据的存取。而数组是通过开辟一段连续的内存来存储数据,这是数组和链表最大的区别!
链表初始化
在使用链表的时候必须要进行初始化,将链表的指针指向自己,为以后添加节点做准 备 ,链表的数据结构也是需要内存空间的,所以也需要进行内存的申请。
/**
* @brief 初始化一个链表
*
* @param
*/
rt_inline void rt_list_init(rt_list_t *l)
{
l->next = l->prev = l;
}
向链表中插入节点
向链表指定节点后面插入节点 rt_list_insert_after()
插入节点需要先申请节点大小的内存,然后根据插入的位置(在某个节点(rt_list_t *l)后面)进行插入操作。
rt_inline void rt_list_insert_after(rt_list_t *l, rt_list_t *n)
{
l->next->prev = n;
n->next = l->next;
l->next = n;
n->prev = l;
}
向链表指定节点前面插入节点 rt_list_insert_before()
rt_inline void rt_list_insert_before(rt_list_t *l, rt_list_t *n)
{
l->prev->next = n;
n->prev = l->prev;
l->prev = n;
n->next = l;
}
从链表删除节点函数
删除节点与添加节点一样,其实删除节点更简单,只需要知道删除哪个节点即可,把该节点前后的节点链接起来,那它就删除了,然后该节点的指针指向节点本身即可,不过要注意的是也要讲该节点的内存释放掉,因为该节点是动态分配内存的,否则会导致内存泄漏。
rt_inline void rt_list_remove(rt_list_t *n)
{
n->next->prev = n->prev;
n->prev->next = n->next;
n->next = n->prev = n;
}
由此可见,链表虽然是操作系统很常用的数据结构,但是,它也是非常简单的,只需要注意节点与节点间的指针关联。