前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >循环双向链表的

循环双向链表的

作者头像
杜争斌
发布2022-04-27 19:19:17
2780
发布2022-04-27 19:19:17
举报
文章被收录于专栏:我的博文

链表的使用

初级版:

  结构体

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档