循环双向链表的

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去创建,内核中的双向链表正是这么实现的,

  特别容易书写,不太会产生副作用。二级指向是在太难理解了

以上是关于循环双向链表的的主要内容,如果未能解决你的问题,请参考以下文章

循环双向链表的C++实现

循环双向链表的

双向链表的原理与实现

数据结构链表,看这两篇就足够了(上集,动图版)

双向循环链表增删查改C语言实现

C++基于双向链表的List