首页 > 其他 > 详细

循环双向链表的

时间:2018-10-19 20:12:46      阅读:132      评论:0      收藏:0      [点我收藏+]

链表的使用

初级版:

  结构体

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

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

循环双向链表的

原文:https://www.cnblogs.com/Bin-DuS/p/9818430.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!