这篇文章写的是双向循环链表,这也是个非常经典的数据结构,我们在看 Linux 内核代码时就经常会遇到它。比如,在Linux的内核中实现进程描述符,使用的就是双向循环链表,因为它使用起来很方便,每个节点不只是有 data 字段,还有 prev , next 字段,对于向前和向后查找相应的节点很方便,下面贴出实现代码,仍然是很简单的操作,且没有过多的错误控制:

头文件:

/** dlut_dclist.h**  Created on: 2014年1月13日*      Author: DLUTBruceZhang*/#ifndef DLUT_DCLIST_H_
#define DLUT_DCLIST_H_typedef       int         need;typedef struct _dclist
{need data;struct _dclist *next;struct _dclist *prev;}dclist;dclist *       dlut_dclist_create();void           dlut_dclist_insert_to_head(dclist *, need);
void            dlut_dclist_insert_to_tail(dclist *, need);void         dlut_dclist_delete_the_head(dclist *);
void            dlut_dclist_delete_the_tail(dclist *);
void            dlut_dclist_delete_the_data(dclist *, need);need            dlut_dclist_get_the_head(dclist *);
need            dlut_dclist_get_the_tail(dclist *);void         dlut_dclist_print_the_dclist(dclist *);void         dlut_dclist_delete_the_dclist(dclist *);#endif /* DLUT_DCLIST_H_ */

C文件:

/** dlut_dclist.c**  Created on: 2014年1月13日*      Author: DLUTBruceZhang*/#include "dlut_dclist.h"
#include <stdlib.h>
#include <stdio.h>dclist * dlut_dclist_create()
{dclist *head;head = (dclist *)malloc(sizeof(dclist));if (!head)return NULL;head -> data = 0;head -> next = head;head -> prev = head;return head;
}void dlut_dclist_insert_to_head(dclist *head, need data)
{dclist *new_node;new_node = (dclist *)malloc(sizeof(dclist));if (!new_node)return;new_node -> data = data;new_node -> next = head -> next;head -> next -> prev = new_node;head -> next = new_node;new_node -> prev = head;head -> data += 1;return;
}void dlut_dclist_insert_to_tail(dclist *head, need data)
{dclist *new_node;new_node = (dclist *)malloc(sizeof(dclist));if (!new_node)return;new_node -> data = data;dclist *_head = head;while (_head -> next != head)_head = _head -> next;new_node -> next = head;head -> prev = new_node;new_node -> prev = _head;_head -> next = new_node;head -> data += 1;return;
}void dlut_dclist_delete_the_head(dclist *head)
{dclist *old_node;if (head -> next == head)return;old_node = head -> next;head -> next -> next -> prev = head;head -> next = head -> next -> next;head -> data -= 1;free(old_node);return;
}void dlut_dclist_delete_the_tail(dclist *head)
{dclist *old_node;if (head -> next == head)return;dclist *_head = head;while (_head -> next != head)_head = _head -> next;old_node = _head;_head -> prev -> next = head;head -> prev = _head -> prev;head -> data -= 1;free(old_node);return;
}void dlut_dclist_delete_the_data(dclist *head, need data)
{if (head -> next == head)return;dclist *_head = head;while (_head -> data != data && _head -> next != head)_head = _head -> next;if (_head -> data == data){_head -> prev -> next = _head -> next;_head -> next -> prev = _head -> prev;head -> data -= 1;}return;
}need dlut_dclist_get_the_head(dclist *head)
{return head -> data == 0 ? -1 : head -> next -> data;
}need dlut_dclist_get_the_tail(dclist *head)
{return head -> data == 0 ? -1 : head -> prev -> data;
}void dlut_dclist_print_the_dclist(dclist *head)
{dclist *_head = head -> next;while (_head != head){printf("%d  ", _head -> data);_head = _head -> next;}printf("\n");return;
}void dlut_dclist_delete_the_dclist(dclist *head)
{while (head -> next != head)dlut_dclist_delete_the_head(head);free(head);return;
}

数据结构 -- 双向循环链表相关推荐

  1. 数据结构--双向循环链表的实现

    前言 之前学习了单链表的实现,单链表在实现的过程中,尾删,尾插是比较麻烦的,时间复杂度为O(N),而双向循环链表就不会有这样的顾虑,双向循环链表的结构是很有优势的.具体优势在实现的时候会显现出来. 双 ...

  2. c语言 数据结构 双向循环链表逆序

    双链循环链表排序: 原链表: 1 2 3 4 5 6 7 8 9 10 逆序后:10 9 8 7 6 5 4 3 2 1 思路: 把最后一个节点删除, 插到head下面去 数据 1 不用管, 把后面的 ...

  3. Python写数据结构:双向循环链表

    注:有头结点 #!/usr/bin/python3.5 # _*_coding:utf-8class Node:def __init__(self, value):self.data = values ...

  4. [C语言数据结构]双向循环链表

    目录

  5. 双向循环链表:鸿蒙轻内核中数据的“驿站”

    本文分享自华为云社区<鸿蒙轻内核M核源码分析系列二 数据结构-双向循环链表>,原文作者:zhushy . 在学习OpenHarmony鸿蒙轻内核源代码的时候,常常会遇到一些数据结构的使用. ...

  6. C语言之链表探究之单向链表(List)、附双向循环链表参考博文地址

    参考博文:C语言数据结构-创建链表的四种方法 链表结构图一 链表结构图二 链表结构图三 链表结构图四 一.静态链表 例1: 附例1代码: #include <stdio.h>typedef ...

  7. 数据结构与算法 | 带头双向循环链表

    上一节里实现的是最简单的链表,在实际中那种链表不会单独用来存储数据,更多是作为其他数据结构的子结构,如图的邻接表等.而比较常用的就是带头双向循环链表. 通过对比我们可以看出有三个不同,多了头节点,链表 ...

  8. 数据结构-线性表之带头结点的双向循环链表

    文章目录 前言 实现 (1)结构定义 (2)基本函数 (3)操作实现 测试 代码 前言 链表的类型有很多种(根据带头或不带头,循环或非循环等等),但是我们重点研究的只有两种,一种结构非常简单是无头单向 ...

  9. 《恋上数据结构第1季》单向循环链表、双向循环链表以及约瑟夫环问题

    循环链表(CircleList) 链表的接口设计 单向循环链表 单向循环链表完整源码 双向循环链表 双向循环链表完整源码 双向循环链表解决约瑟夫环问题 如何发挥循环链表的最大威力? 静态链表 数据结构 ...

最新文章

  1. 法总统:英国若“无协议脱欧” 将成最大输家
  2. 【Python之路】第五篇--Python基础之杂货铺
  3. 基本排序算法及分析(二):冒泡排序
  4. linux 启动 x,(1)linux启动过程
  5. window使用fliqlo 教程
  6. 100道MySQL数据库经典面试题解析(收藏版)
  7. hadoop常用端口号
  8. Python起重机主梁截面特性计算小程序
  9. 六轴传感器——姿态检测(20200112)(未完)
  10. 测试转开发,我都经历了什么
  11. win10磁盘管理_Win10磁盘管理器:轻松和安全地调整Win10的分区大小
  12. .NET中对于日文输入法的控制
  13. 为何风口过去之后,百果园反而要在无人零售上发力?
  14. 计算机网线接口灯怎样是正常,电脑网线接口灯不亮是什么原因
  15. 怎样让健康码截图合并一张图片_健康码拼图
  16. 网页文字无法复制的解决方法
  17. android 腾讯微博授权,5腾讯微博Android客户端开发获取请求用户授权Request Token.pdf...
  18. pulseaudio-webrtc-audio-processing的编译环境搭建
  19. 微信小程序 slot插槽基本使用
  20. 电脑桌面壁纸更换后不一会就变成黑屏

热门文章

  1. 变态跳台阶,很难很难,终于想出来了,附推导过程,为自己鼓掌
  2. Linux 自动重启进程
  3. ptyhon时间处理
  4. [NET] 如何从 Winform 移植到 Webform [自己搞定HTTP协议]
  5. 轻松搭建博客平台-开源ASP.NET 博客Subtext 的安装
  6. (十二)java版b2b2c社交电商spring cloud分布式微服务:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪...
  7. SQL经典实例(五)元数据查询
  8. 程序设计语言常见面试题
  9. 组件(2):使用Prop下发数据
  10. swift3.0:NSURLSession的使用