/*****************************************************
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语言的更多相关文章

  1. 一种神奇的双向循环链表C语言实现

    最近在看ucore操作系统的实验指导.里面提要一个双向循环链表的数据结构,挺有意思的. 其实这个数据结构本身并不复杂.在普通链表的基础上加一个前向指针,我们就得到了双向链表,再把头尾节点连起来就是双向 ...

  2. 不带头结点的单链表------C语言实现

    File name:no_head_link.c Author:SimonKly Version:0.1 Date: 2017.5.20 Description:不带头节点的单链表 Funcion L ...

  3. C语言通用双向循环链表操作函数集

    说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  ...

  4. c语言双向循环链表

    双向循环链表,先来说说双向链表,双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继 ...

  5. C++实现双向循环链表

    本次博文是关于利用C++模板的方式实现的双向循环链表以及双向循环链表的基本操作,在之前的博文C++语言实现双向链表中,已经给大家分析了双向循环链表的结构,并以图示的方式给大家解释了双向循环链表的基本操 ...

  6. java数据结构-06双向循环链表

    双向循环链表跟单向链表一样,都是头尾相连,不过单向是尾指向头,双向是头尾互相指,可以从前往后查,也可以从后往前查 无头结点的双向循环链表 public class CircleLinkedList&l ...

  7. 【C语言教程】“双向循环链表”学习总结和C语言代码实现!

    双向循环链表 定义 双向循环链表和它名字的表意一样,就是把双向链表的两头连接,使其成为了一个环状链表.只需要将表中最后一个节点的next指针指向头节点,头节点的prior指针指向尾节点,链表就能成环儿 ...

  8. 双向循环链表(C语言描述)(四)

    下面以一个电子英汉词典程序(以下简称电子词典)为例,应用双向循环链表.分离数据结构,可以使逻辑代码独立于数据结构操作代码,程序结构更清晰,代码更简洁:电子词典的增.删.查.改操作分别对应于链表的插入. ...

  9. 双向循环链表(C语言描述)(一)

    双向循环链表是链表的一种,它的每个节点也包含数据域和指针域.为了方便程序维护,可以单独为数据域定义一种数据类型,这里以整型为例: typedef int LinkedListData; 双向循环链表( ...

随机推荐

  1. K-th Closest Distance

    题目链接 题意:n个数,q次查询,查询[l , r] 内, | a[i] - p | 第k大的数 思路:主席树维护下权值大小,二分答案,查询区间[p - mid, p + mid] 的个数 #incl ...

  2. MySQL 5.7配置文件

    原文:http://www.voidcn.com/article/p-zrikccdi-hr.html # MySql5.7配置文件my.cnf设置[client]port = 3306socket ...

  3. oracle服务端导出/导入方式expdp/impdp

    1. expdp导出步骤 1.1 用sys管理员登录sqlplus [root@hxjk_test_mysql_redis_file oracle]# sqlplus SQL*Plus: Releas ...

  4. SSH的两种登录方式

    ssh客户端使用的是Xshell,windows环境. 第一种方式,用户名密码方式 原理如下: 客户端发起ssh请求之后,服务器把自己的公钥传给客户端 客户端输入服务器密码通过公钥加密之后传给服务器 ...

  5. Mysql任意读取客户端文件复现

    本机执行 python rogue_mysql_server.py 目标机器上连接本机数据库 mysql -u root -p -h 本机IP mysql -h 192.168.250.132 -ur ...

  6. Window/Linux + Vim + MingW 配置

    Windows: 首先安装Vim , MinGW,假设安装目录为D:\MinGW. 配置环境变量: LIBRARY_PATH=D:\MinGW\lib C_INCLUDE_PATH=D:\MinGW\ ...

  7. CTU OPEN 2017 Go Northwest! /// 简单公式

    题目大意: 给定n个点 求任选一对点连成的直线斜率为1或-1的概率 对于点(x1,y1) 和 点(x2,y2) 斜率 k=(y1-y2)/(x1-x2) 当k=1 则 (y1-y2)/(x1-x2)= ...

  8. 分布式-技术专区-Redis和MySQL缓存一致性问题

    1.Redis 缓存和 MySQL 数据如何实现一致性 需求起因 缓存和数据库一致性解决方案 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操 ...

  9. ASP.NET MVC 学习笔记之TempData、HttpContext和HttpContextBase杂谈

    TempData本质上是Session 但是有一点不同的是,TempData被赋值之后,一旦被Action访问一次之后,马上就会清空. System.Web.HttpContext 和System.W ...

  10. ionic ios上状态栏和app重叠解决方案

    干货文章 ·2018-03-22 01:33:01 官方issues: https://github.com/ionic-team/ionic/issues/13294 解决办法: 1.在 confi ...