循环双向链表的
Posted bin-dus
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环双向链表的相关的知识,希望对你有一定的参考价值。
链表的使用
初级版:
结构体
struct data{
struct data* next;
int data;
};
head=p1->p2->p3->p4->NULL
需要删除节点p3时就很麻烦,我们需要从头去遍历,找到next指针为p3时将next指针指向p3的next;
为此方便起见,我们可以使用双向链表进行实现。操作会简单许多
NULL<-head=>p1<=>p2<=>p3<=>p4->NULL;
删除p3节点时,我们需要获取p2(p3->pre)
p3->pre->next = p3->next;
p3->next->pre = p3->pre;
这时我们需要判断p3->pre p3->next是否存在,不存在时直接段错误。
内核中是这样处理的,
创建一个双向循环链表
=>head<=>p1<=>p2<=>p3<=>p4=
向链表中指定位置插入节点
原有链pre<=>next
这也是最基本的插入节点的方法
_add_data(struct data* input,struct data* pre,struct data* next){
pre->next = input;
input->pre = pre;
next->pre = input;
input->next = next;
}
头插法在_add_data的基础上实现就直观多了;
add_head(struct data *input,struct data* head){
_add_data(input,head,head->next);//在头和头的下一个节点插入节点
}
尾插法
add_tail(struct data *input,struct data * head){
_add_data(input,head->pre,head);//头节点的前一个节点就是尾,在尾和头结点之间插入就是插入到尾了。
}
根据插入节点的方式写删除节点就容易的多了
_del(struct data * pre,struct data * next){
pre->next = next;
next->pre = pre;
}
del(struct data* input){
_del(input->pre,input->next);//执行完后,节点就从链上摘下来了。
}
没有做释放的代码,创建链的时候需要用malloc去创建,内核中的双向链表正是这么实现的,
特别容易书写,不太会产生副作用。二级指向是在太难理解了
以上是关于循环双向链表的的主要内容,如果未能解决你的问题,请参考以下文章