循环链表

c语言实现--单向循环链表操作

白昼怎懂夜的黑 提交于 2020-03-20 11:52:20
1,什么叫单向循环链表。单向循环链表是指在单链表的基础上,表的最后一个元素指向链表头结点,不再是为空。 2,由图可知,单向循环链表的判断条件不再是 表为空了,而变成了是否到表头。 3,链表的结点表示 1 struct LNode 2 { 3 int data; 4 struct LNode * next; 5 }; 6 typedef struct LNode * linklist 4,单向循环链表的操作集合,仍是defs.h里的操作集合,这里就不给出了。 5,单循环链表的初始化操作。示意图 实现: 1 #include"defs.h" 2 3 void InitList(linklist *L) //改变尾指针 4 { 5 *L = (linklist)malloc(sizeof(struct LNode)); //分配头结点 6 if (*L == NULL) //分配失败 7 exit(0); 8 (*L)->next = *L; //指针域指向它本身 9 } 6,清空操作最終图和初始化的结果是一样的。 1 #include"defs.h" 2 3 void ClearList(linklist *L) //改变尾指针 4 { 5 linklist p, q; 6 *L = (*L)->next; //先令尾指针指向头结点,不然释放最后一个结点时尾指针,无法指向头结点 7 p

18 循环链表

烂漫一生 提交于 2020-03-17 02:15:12
1,循环链表的初始化 定义一个头结点和尾指针的方式,头结点在这里是用来连接 第一个结点和最后一个结点的结点 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 typedef struct Link { 5 int data; 6 struct node* next; 7 }link; 8 9 link* head_node; //声明一个头结点 10 link* ptail; //声明一个尾指针 11 12 link* initLink() //初始化循环链表 13 { 14 link* new_node; 15 head_node = (link*)malloc(sizeof(link)); 16 ptail = head_node; //尾指针指向头结点 17 18 //初始化创建10个结点的循环链表 19 for (int i = 0; i < 10; i++) 20 { 21 link* new_node = (link*)malloc(sizeof(link)); 22 ptail->next = new_node;//把新节点接到链表上去,相当于head_node->next = new_node,但这里不能使用head_node->next,而是使用ptail->next,因为头结点不能动 23 24 new_node-

数组和链表区别

我是研究僧i 提交于 2020-03-17 01:01:41
总结: 1) 数组 便于 查询和修改 ( 顺序线性 ),但是不方便新增和删除 2) 链表 适合 新增和删除 ( 指针 ),但是不适合查询,根据业务情况使用合适的数据结构和算法是在大数据量和高并发时必须要考虑的问题 1.链表是什么 链表是一种上一个元素的引用指向下一个元素的存储结构,链表通过 指针来连接 元素与元素; 链表是 线性表 的一种,所谓的线性表包含顺序线性表和链表, 顺序线性表是用 数组 实现的 ,在内存中有顺序排列,通过改变数组大小实现。 而 链表 不是用顺序实现的,用指针实现, 在内存中不连续 。意思就是说,链表就是将一系列不连续的内存联系起来,将那种碎片内存进行合理的利用,解决空间的问题。 所以, 链表允许插入和删除表上任意位置上的节点 ,但是不允许随即存取。 链表有很多种不同的类型:单向链表、双向链表及循环链表。 2.单向链表 单向链表包含两个域,一个是 信息域 ,一个是 指针域 。也就是单向链表的节点被分成两部分,一部分是保存或显示关于节点的信息,第二部分存储下一个节点的地址,而最后一个节点则指向一个空值。 3.双向链表 从上图可以很清晰的看出,每个节点有2个链接,一个是指向前一个节点(当此链接为第一个链接时,指向的是空值或空列表),另一个则指向后一个节点(当此链接为最后一个链接时,指向的是空值或空列表)。 意思就是说 双向链表有2个指针

笔记--循环链表

蹲街弑〆低调 提交于 2020-03-07 23:55:14
循环链表是另一种形式的链式存储结构形式。 循环单链表:将表中尾结点的指针域改为指向表头结点,整个链表形成一个环。由此从表中任一结点出发均可找到链表中其他结点。结点类型与非循环单链表的相同。 循环双链表:形成两个环。结点类型与非循环双链表的相同。 1.循环单链表 (图片来自中国大学MOOC) 与非循环单链表相比,循环单链表: 链表中没有空指针域 p所指结点是尾结点的条件: p->next==L 2.循环双链表 (图片来自中国大学MOOC) 与非循环双链表相比,循环双链表: 链表中没有空指针域 p所指结点为尾结点的条件: p->next==L 一步操作即L->prior可以找到尾结点 看一个例子: 问题描述: 设计判断带头结点的循环双链表L(含两个以上的结点)是否对称相等的算法。 算法思路: 设置两个数据结点p和q,p从左向右扫描链表 L ,q从右向左扫描链表 L 若p和q对应的 data 域不相等,则退出循环,说明该链表不对称 否则继续比较,直到p与q相等(数据结点个数为奇数)或p的下一个结点为 *q (数据结点为偶数)为止 代码实现: # include <stdio.h> # include <stdlib.h> # define MaxSize 100 typedef int ElemType ; typedef struct DNode * DLinkList ;

C语言实现单循环链表

泪湿孤枕 提交于 2020-03-07 04:13:17
第一次在CSDN这边写博客,主要是为了记录自己学习的历程,望诸位共勉。 首先循环链表是神魔恋?其实就是为了解决单链表只能从头开始过于麻烦诞生的,我愿称之为单链表2.0。(所以如果搞不清楚的话建议先学一下单链表。) 那么它和单链表之间是什么关系,单链表的结尾指向的是一个空节点,存着NULL这个空值。那么他在索引的时候出现的问题显而易见,如果你不从头结点开始那你就无法访问全部结点。 循环链表的设计者明显就很鬼才了,我把最后一个结点的指向变成头节点不就可以了,这样我就可以从想开始的地方开始索引,而且都能保证索引到全部结点,然后这个链表就像贪吃蛇咬到自己尾巴一样闭环了,就叫(单)循环链表。 下面贴出代码的具体实现,如有不对欢迎指正。 # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <stdlib.h> # include <time.h> # define ERROR 0 # define OK 1 typedef int EleType ; typedef struct CLinkNode { EleType data ; struct CLinkNode * next ; } CLinkNode , * CLinkList ; //初始化循环链表 int InitCLinkList ( CLinkList *

java 双向循环链表

浪尽此生 提交于 2020-03-03 22:41:44
博客园第一篇正式文章,献上自己的原创代码,欢迎园友交流指教! java 之 双向循环链表 新鲜出炉 1 package com.xlst.util; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 import java.util.UUID; 6 7 /** 8 * 双向循环链表 9 * 完成时间:2012.9.28 10 * 版本1.0 11 * @author xlst 12 * 13 */ 14 public class BothwayLoopLinked { 15 /** 16 * 存放链表长度的 map 17 * 18 * 如果简单使用 static int 型的 size 基本类型变量,则只能维护一个双向循环链表。 19 * 同时存在两个及以上双向循环链表时,数据会错乱 20 */ 21 private static final Map<String, Integer> sizeMap = new HashMap<String, Integer>(); 22 /** 23 * 双向链表的 id 24 * 一个双向一个唯一的 id 25 * 根据这个id可以从 sizeMap 中取出当前链表的长度 26 */ 27 private String linkedId = null; 28 29 /** 30 *

循环链表模版--约瑟夫

南楼画角 提交于 2020-03-01 14:27:02
#include <stdio.h> #include <string.h> #include <stdlib.h> int n,m; typedef struct node { int date; struct node *next; }node; int main() { int i,sum=0,count=0; scanf("%d%d",&n,&m); node *tail,*head,*p,*q; head=(node *)malloc(sizeof(node)); head->date=1; head->next=NULL; tail=head; for(i=2;i<=n;i++) { p=(node *)malloc(sizeof(node)); p->date=i; p->next=NULL; tail->next=p; tail=p; } tail->next=head; for(q=head;q->next!=head;) q=q->next; while(count<n-1) { p=q->next; sum++; if(sum%m==0) { q->next=p->next; free(p); count++; } else q=p; } printf("%d\n",q->date); return 0; } 来源: https://www.cnblogs

使用循环链表实现约瑟夫环(围圈报数问题)

巧了我就是萌 提交于 2020-03-01 14:26:11
刚开始学C,碰到经典的围圈报数问题,现先将实现代码附下: #include<stdio.h> #include<stdlib.h> struct LNODE{            //链表定义 int data; struct LNODE *next; }; typedef struct LNODE Lnode; typedef struct LNODE *LinkList; struct LNODE *create(int s[])      //创建单项循环链表 { struct LNODE *head=NULL,*p=NULL,*last=NULL; int i=0; head=(struct LNODE *)malloc(sizeof(struct LNODE)); if(!head) printf("memory allocation error!"); if(s[0]!=0) { head->data=s[0]; head->next=head; last=head; i++; while(s[i]!=0)      //判断是否为0,为0则结束 { p=(struct LNODE*)malloc(sizeof(struct LNODE)); last->next=p; p->data=s[i];   p->next=head; last=p; i++; } }

用循环链表解决约瑟夫环的问题

北城以北 提交于 2020-03-01 14:24:08
约瑟夫环问题简介 约瑟夫环问题的原来描述为,设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。 稍微简化一下。 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。 解题思路 将每个人的编号作为结点值,因为报数是循环着来的,故可以利用循环链表。 因为最后只有一个人获胜,所以筛选的次数为n-1次,里面的每次循环m次,表示循环到的第m个人淘汰。 代码及运行截图 #include<iostream> #include<cstdio> using namespace std; struct node { int value; struct node *next; }; int n, m;//共n个人,报数报到m的人淘汰 //创建循环链表 struct node *init() { struct node *h = NULL; struct node *t = NULL; struct node *p = NULL; for (int i = 1; i <= n; ++i) { p = (struct node*)malloc

数据结构与算法分析:(五)循环链表

自闭症网瘾萝莉.ら 提交于 2020-02-29 02:05:50
一、前言 相信小伙伴们在前面两篇文章的详细介绍已经对单向链表、双向链表有一个很清晰的认识了。 数据结构与算法分析:(三)单向链表 数据结构与算法分析:(四)双向链表 接下来我们来介绍循环链表,你把单向链表、双向链表搞清楚了的话,循环链表自然也不难了。 循环链表可分为:单向循环链表、双向循环链表。 1、单向循环链表: 单向循环链表跟单向链表唯一的区别就在 尾结点 。我们知道,单向链表的尾结点指针指向空地址,表示这就是最后的结点了。而单向循环链表的尾结点指针是指向链表的头结点。从我画的单向循环链表图中,你应该可以看出来,它像一个环一样首尾相连,所以叫作“单向循环”链表。 和单向链表相比,单向循环链表的优点是从链尾到链头比较方便。当要处理的数据具有环型结构特点时,就特别适合采用单向循环链表。比如著名的 约瑟夫问题 。尽管用单向链表也可以实现,但是用单向循环链表实现的话,代码就会简洁很多。 2、双向循环链表: 双向循环链表想必也不用我多说了吧。 二、循环链表实战 假设有这么一个小游戏: 100个人围成圆圈,从1开始报数,喊到3人的时候退出,重复,直到剩下最后一个人。 看到围成圆圈,立马想到了 循环链表 这个数据结构。 1、我们先来定义循环链表的接口 public interface CircularLinkedList < E > { /** * 向链表插入一个元素,默认在尾部 *