大声告诉我操作系统最喜欢用什么?链表!

2020-06-15

链表?在平时写程序的时候用的并不多,但在操作系统里面使用的非常多。链表就好比一个圆形的晾衣架。。。

链表分为单向链表和双向链表,单向链表很少用,使用最多的还是双向链表。

链表是通过节点把离散的数据链接成一个表,通过对节点的插入和删除操作从而实现对数据的存取。而数组是通过开辟一段连续的内存来存储数据,这是数组和链表最大的区别!

链表初始化

在使用链表的时候必须要进行初始化,将链表的指针指向自己,为以后添加节点做准 备 ,链表的数据结构也是需要内存空间的,所以也需要进行内存的申请。

/**
 * @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;
}

由此可见,链表虽然是操作系统很常用的数据结构,但是,它也是非常简单的,只需要注意节点与节点间的指针关联。