带头结点的双向循环链表----------C语言
- /*****************************************************
- Author:Simon_Kly Version:0.1 Date: 20170520
- Description:带头结点的双向循环链表
- Mail: degaullekong@gmail.com
- Funcion List:
- *****************************************************/
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct node
- {
- int data;
- struct node *prior, *next;
- }Node, *Link;
- void is_malloc_ok(Link head)
- {
- if (head == NULL)
- {
- printf("malloc is error!\n");
- exit(-);
- }
- }
- /*创建链表*/
- void create_link(Link * head)
- {
- *head = (Link)malloc(sizeof(Node));
- is_malloc_ok(*head);
- (*head)->next = (*head)->prior = *head;//让其指向自己
- }
- /*创建节点*/
- void create_node(Link * new_node)
- {
- *new_node = (Link)malloc(sizeof(Node));
- is_malloc_ok(*new_node);
- }
- /*插入节点(头插)*/
- void insert_node_head(Link head, Link new_node)
- {
- new_node->prior = head;
- new_node->next = (head)->next;
- (head)->next->prior = new_node;
- (head)->next = new_node;
- }
- /*插入节点(尾插)*/
- void insert_node(Link * head, Link new_node)
- {
- Link p = NULL;
- p = *head;
- while (p->next != *head)
- {
- p = p->next;
- }
- new_node->prior = p;
- new_node->next = p->next;
- p->next->prior = new_node;
- p->next = new_node;
- }
- /*输出链表*/
- void out_link(Link head)
- {
- Link p = NULL;
- #if 0
- if (head->next == head)
- {
- printf("link is empty\n");
- return ;
- }
- #endif
- if (head == NULL)
- {
- printf("link is empty\n");
- return ;
- }
- p = (head)->next;
- while (p != head)
- {
- printf("%d\n", p->data);
- p = p->next;
- }
- putchar();
- }
- /*变成空链*/
- void make_empty(Link * head)
- {
- Link p = NULL;
- p = (*head)->next;
- while (*head != (*head)->next)
- {
- (*head)->next = p->next;//head移动
- free(p);//释放head之前的节点
- p = (*head)->next;
- }
- }
- /*释放链表*/
- void release_link(Link * head)
- {
- make_empty(head);
- free(*head);
- *head = NULL;
- }
- /*删除节点*/
- void delete_node(Link * head, int data)
- {
- Link p = NULL;
- p = (*head)->next;
- if (p == *head)//空链
- {
- printf("link is empty!\n");
- return ;
- }
- /*非空链*/
- while (p != *head && p->data != data)
- {
- p = p->next;//找那个节点
- }
- if (p == *head)//找一圈没找到
- {
- printf("No such node!\n");
- return ;
- }
- else//找到并改变指向
- {
- p->prior->next = p->next;
- p->next->prior = p->prior;
- free(p);
- }
- }
- void insert_node_seq(Link * head, Link new_node)
- {
- Link p = NULL;
- p = (*head);
- while (p->next != *head && new_node->data < p->next->data)//找到该位置的前一个位置
- {
- p = p->next;
- }
- #if 0
- if (p == *head)//找到尾部
- {
- new_node->prior = p->prior;
- new_node->next = p;
- p->prior->next = new_node;
- p->prior = new_node;
- return ;
- }
- #endif
- new_node->prior = p;
- new_node->next = p->next;
- p->next->prior = new_node;
- p->next = new_node;
- }
- int main()
- {
- int i;
- Link head = NULL;
- Link new_node = NULL;
- create_link(&head);
- out_link(head);
- for (i = ; i < ; i++)
- {
- create_node(&new_node);
- new_node->data = i + ;
- // insert_node(&head, new_node);
- insert_node_head(head, new_node);
- }
- out_link(head);
- #if 1
- printf("please input i\n");
- scanf("%d", &i);
- putchar();
- create_node(&new_node);
- new_node->data = i;
- insert_node_seq(&head, new_node);
- out_link(head);
- #endif
- #if 0
- delete_node(&head, );
- out_link(head);
- #endif
- release_link(&head);
- out_link(head);
- return ;
- }
带头结点的双向循环链表----------C语言的更多相关文章
- 一种神奇的双向循环链表C语言实现
最近在看ucore操作系统的实验指导.里面提要一个双向循环链表的数据结构,挺有意思的. 其实这个数据结构本身并不复杂.在普通链表的基础上加一个前向指针,我们就得到了双向链表,再把头尾节点连起来就是双向 ...
- 不带头结点的单链表------C语言实现
File name:no_head_link.c Author:SimonKly Version:0.1 Date: 2017.5.20 Description:不带头节点的单链表 Funcion L ...
- C语言通用双向循环链表操作函数集
说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低. 可基于该函数集方便地构造栈或队列集. 本函数集暂未考虑并发保护. 一 ...
- c语言双向循环链表
双向循环链表,先来说说双向链表,双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继 ...
- C++实现双向循环链表
本次博文是关于利用C++模板的方式实现的双向循环链表以及双向循环链表的基本操作,在之前的博文C++语言实现双向链表中,已经给大家分析了双向循环链表的结构,并以图示的方式给大家解释了双向循环链表的基本操 ...
- java数据结构-06双向循环链表
双向循环链表跟单向链表一样,都是头尾相连,不过单向是尾指向头,双向是头尾互相指,可以从前往后查,也可以从后往前查 无头结点的双向循环链表 public class CircleLinkedList&l ...
- 【C语言教程】“双向循环链表”学习总结和C语言代码实现!
双向循环链表 定义 双向循环链表和它名字的表意一样,就是把双向链表的两头连接,使其成为了一个环状链表.只需要将表中最后一个节点的next指针指向头节点,头节点的prior指针指向尾节点,链表就能成环儿 ...
- 双向循环链表(C语言描述)(四)
下面以一个电子英汉词典程序(以下简称电子词典)为例,应用双向循环链表.分离数据结构,可以使逻辑代码独立于数据结构操作代码,程序结构更清晰,代码更简洁:电子词典的增.删.查.改操作分别对应于链表的插入. ...
- 双向循环链表(C语言描述)(一)
双向循环链表是链表的一种,它的每个节点也包含数据域和指针域.为了方便程序维护,可以单独为数据域定义一种数据类型,这里以整型为例: typedef int LinkedListData; 双向循环链表( ...
随机推荐
- vue中引入路由,如果你懒得写那么
可以npm i vue-router --save,项目中自动给你写好,vuex也可以
- BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡(高斯消元+期望dp)
传送门 解题思路 设\(f(x)\)表示到\(x\)这个点的期望次数,那么转移方程为\(f(x)=\sum\frac{f(u)*(1 - \frac{p}{q})}{deg(u)}\),其中\(u\) ...
- [CSP-S模拟测试]:简单的填数(贪心+模拟)
题目描述 对于一个长度为$n$,且下标从$1$开始编号的序列$a$,我们定义它是「合法的」,当且仅当它满足以下条件:·$a_1=1$·对于$i\in [1,n),a_i\leqslant a_{i+1 ...
- FFMpeg视频解码初探
在视频解码前,先了解以下几个基本的概念: 编解码器(CODEC):能够进行视频和音频压缩(CO)与解压缩(DEC),是视频编解码的核心部分. 容器/多媒体文件(Container/File):没有了解 ...
- Apache2.2+mod_encoding解决URL中文编码问题
我们经常在论坛上看到这样的求救贴: 为什么我看不了网站上中文文件名的文件?这时一定会有好心的大侠告诉说,到IE6的工具,Internet选项, 高级里,把"总是以UTF-8发送URL&quo ...
- 3.Jmeter 快速入门教程(三-1) --添加响应断言(即loadrunner中所指的检查点)
上一节课,我们创建了一个测试场景,并进行了少量vuser的负载测试. 有时候我们执行了测试,但是发现并不是所有事务都执行成功了. 那是因为我们只是发起了测试,但并没有对每次请求测试的返回作校验. 所以 ...
- 用Emacs进行Python开发
用Emacs进行Python开发 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} ...
- java性能调优02
1.字符串优化处理 1.1 常量池的优化:当String对象拥有相同的值时,他们只引用常量池的同一个拷贝. String a="123"; String b="123&q ...
- Day1 - 认识大数据& 企业需求分析 & 北风网简介
上午: 介绍: 海量的乱七八糟的数据中快速的计算出某些有用的信息 刑侦视频追踪 云栖大会 大数据分析/挖掘 ==> python <== 重点关注 大数据运维 ==> 运服务 ...
- 【Elasticsearch 7 探索之路】(六)初识 Mapping
上一篇主要讲解什么是 URL Search 和 Request Body Search 的语法.本篇对 Mapping 的 Dynamic Mapping 以及手动创建 Mapping 进行讲解. 1 ...