循环链表

约瑟夫循环

旧城冷巷雨未停 提交于 2019-12-04 18:41:37
数据结构的第一个实验拖了好久才完成,总算是能够理解其中指针是咋用的了,但估计要我再单独自己写还是够呛。 但是至少学会了如何构建循环链表,理解了结构体中 可以包含指向本结构体类型的指针成员,以及动态存储空间的分配 。 1. 实验题目:线性表应用 约瑟夫(Joeph)问题的一种描述是:编号为 1,2,…,n的 n个人按顺时针方向围坐一圈, 每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值 m,从第一个人开始 按顺时针方向自 1开始顺序报数,报到 m时停止报数。报 m的人出列,将他的密码作为新的 m值,从他在顺时针方向上的下一个人开始重新从 1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。 2. 需求分析 本程序用C语言编写,以循环链表完成功能,要完成此程序要熟练掌握创建循环链表、在结构体中定义一个指针类型的成员变量、在链表中插入节点、删除节点、及对约瑟夫循环如何进行有充分的理解,通过一系列工作输出出列顺序。 ① 输入的形式和输入值的范围:插入元素是需要输入进行游戏的人数及每个人的密码,还要输入初始密码值。所有输入元素都要是正整数。 ② 输出的形式:依次按出列顺序输出序号。 ③ 程序所能达到的功能:1、尾插法插入节点。2、通过密码控制删除节点。3、计算出出列顺序及节点删除的顺序; ④ 测试数据:m的初值为 20;密码:3,1,7,2,4,8,4

[数据结构]链表相关的实现

喜你入骨 提交于 2019-12-03 17:27:14
LinkList.cpp //链表相关操作的实现 // // Created by leoxae on 19-11-5. // #include "LinkList.h" /** * [1]头插法建立单链表 * @return */ LinkList LinkListclass::HeadInsertCreateList(void) { char ch; LinkList head; ListNode *p; head = NULL;/*初始化为空*/ ch = getchar(); while (ch != '\n') { p = (ListNode *) malloc(sizeof(ListNode));/*分配空间*/ p->data = ch;/*数据域赋值*/ p->next = head;/*指定后继指针*/ head = p;/*head指针指定到新插入的结点上*/ ch = getchar(); } return (head); } /** * [2]尾插法建立单链表 * @return */ LinkList LinkListclass::TailInsertCreateList() { char ch; LinkList head; ListNode *p, *r; head = NULL; r = NULL;/*r为尾指针*/ while ((ch =

约瑟夫环问题小结

匿名 (未验证) 提交于 2019-12-03 00:40:02
一 问题描述 约瑟夫环问题的基本描述如下:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。 从编号为1的人开始报数 ,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,要求找到最后一个出列的人或者模拟这个过程。 二 问题解法 在解决这个问题之前,首先我们对人物进行虚拟编号,即相当于从0开始把人物重新进行编号,即用0,1,2,3,...n-1来表示人物的编号,最后返回的编号结果加上1,就是原问题的解(为什么这么做呢,下文有解释)。而关于该问题的解通常有两种方法: 1.利用循环链表或者数组来模拟整个过程。 具体来讲,整个过程很明显就可以看成是一个循环链表删除节点的问题。当然,我们也可以用数组来代替循环链表来模拟整个计数以及出列的过程。此处只给出利用数组来模拟这个过程的解法,最终结果为最后一个出列的人的编号: #include<iostream> #include<unordered_map> #include<queue> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<sstream> #include<set> #include<map> using namespace std; int main() { int

循环链表模拟约瑟夫环

匿名 (未验证) 提交于 2019-12-03 00:21:02
第二个实验~~~循环链表实现约瑟夫环 问题描述: 约瑟夫(joseph):编号为1,2,。。。,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。试设计一个程序显示出列顺序。 〖基本要求〗:利用单向循环链表存储结构模拟此过程,按照出列的顺序打印出各人的编号。 〖测试数据〗:m的初值为20,密码:3,1,7,2,4,8,6 〖结果为〗:出列编号:6,1,4,7,5,3,2 实验步骤: (1)定义结构体及所存储人的序号和密码 typedef struct LNode { }; struct LNode *head,*p,*pt; (2)创建循环链表函数 定义一个变量i,给头指针分配内存空间,如果分配不成功,则返回0,否则就将head赋值给指针p,通过一个for循环给指针pt分配内存空间,如果分配不成功,则返回0,否则就将pt赋值给p所指的下一个指针。之后退出for循环开始构建循环链表,令头指针复制给p所指向的下一个指针,head赋值给p指针,将最后指针与头指针连接起来形成了循环链表。 int creatLinkList(int n) { } (3)创建所需密码函数

29、 循环链表

匿名 (未验证) 提交于 2019-12-03 00:18:01
概念上:任意数据元素都有一个前驱后一个后继,所有的数据元素的关系构成一个逻辑上的环。 实现上:循环链表是一种特殊的单链表,尾节点的指针域保存了首结点的地址。 通过模板定义CircleList类,继承自LinkList类,定义内部函数last_to_first(),用于将单链表首尾相连。 特殊处理:首元素的插入操作和删除操作。 重新实现:清空操作和遍历操作。 循环链表的实现要点:插入位置为0时:头结点和尾结点均指向新结点。新结点成为首结点插入链表。 删除位置为0时:头结点和尾结点指向位置为1的结点,安全销毁首结点。(先移动两个指针,销毁首结点) 单向循环链表:表尾节点存储的指针不为NULL,而是该链表表头节点的指针。应用: 循环链表的应用:约瑟夫环问题,那个人,从k开始报数,数到m的那个人出列,下一个又从一开始,直到全部出列。 template <typename T> class CircleList:public LinkList<T> { protected: typedef typename LinkList<T>::Node Node; int mod(int i) const { return (this->m_length==0)?0:(i%(m_length)); } Node* last() const { return this->position(this->m

带头节点的双循环链表

匿名 (未验证) 提交于 2019-12-02 23:52:01
如题;这是一套完整的可运行的代码;需要读者有一定的基础去阅读; 语言是用C语言实现;在C++环境中编写;在C++中可直接运行;在C语言中需要改部分头文件和输出语句; 头文件;这要是代码的声明部分; # ifndef _LINKLIST_ # define _LINKLIST_ # include <iostream> using namespace std; typedef int DataType; typedef struct Node { DataType data; struct Node * next; struct Node * prior; }LNode, *LinkList; LinkList CreateLinkList(void); void DestroyLinkList(LinkList * pH); int LengthLinkList(LinkList H); void TraversalLinkList(LinkList H); LinkList SearchLinkListPos(LinkList H, int pos); LinkList SearchLinkListValue(LinkList H, DataType x); int InsertLinkListPos(LinkList H, int pos, DataType x); int

集合运算 单循环链表 c语言

匿名 (未验证) 提交于 2019-12-02 23:43:01
实现详情 两个带头结点的单循环链表存储的集合A、B,其元素类型为字符,实现了以下功能: 用户自定义输入集合A、B中的元素 求集合A、B的交C=A∩B,并输出集合C的元素 求集合A、B的并D=A∪B,并输出集合D的元素 求集合A与B的对称差E,并输出集合E的元素 设计一个菜单,具有输入集合元素、求集合A、B的交C、求集合A、B的并D、求集合A与B的对称差E、退出等基本的选项。. 结构体 typedef struct circle_list { int data ; struct circle_list * next ; } list ; 运行效果 源码获取 资料获取地址: https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-16642529690.6.204d1f20abAyxf&id=596381788942 转载请标明出处: 集合运算 单循环链表 c语言 文章来源: https://blog.csdn.net/coffee_fighter/article/details/92090027

双向循环链表

匿名 (未验证) 提交于 2019-12-02 23:40:02
这是我做的一个简单的 双向循环链表。 在双向循环链表当中最重要的是对四个指针的控制,其它地方与之前学的无异。 1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef int DataType; 4 //链表结点 5 typedef struct node{ 6 DataType data; 7 struct node *front; 8 struct node *next; 9 }LinkList; 10 //初始化双向链表 11 int IntList(LinkList *L){ 12 L=(LinkList*)malloc(sizeof(LinkList)); 13 L->front=L->next=L; 14 L->data=0; 15 } 16 //输入双向链表的值(尾插法) 17 int InputList(LinkList *L){ 18 LinkList *NewNode,*p; 19 p=L; 20 int length,data; 21 printf("请输入想要创建链表的长度:"); 22 scanf("%d",&length); 23 for(int i=0; i<length; i++) { 24 NewNode=(LinkList*)malloc(sizeof(LinkList)); 25 if(NewNode

已知由一个线性链表表示的线性表中含有 3 类字符的数据元素(如:字母,数字和其他字符),试编写算法将该线性链表分割为 3 个循环链表,其中每个循环链表均只含有一类字符。

匿名 (未验证) 提交于 2019-12-02 23:32:01
版权声明:版权归作者所有 https://blog.csdn.net/mo_chen1025/article/details/90245633 已知由一个线性链表表示的线性表中含有 3 类字符的数据元素(如:字母,数字和其他字符),试编写算法将该线性链表分割为 3 个循环链表,其中每个循环链表均只含有一类字符。 编程要求: 输入: 键盘输入一串字符,含上述的 3 类字符,各类字符数目 5 个以上输出; 屏幕分别打印循环链表 A,B,C 的元素。 # include <stdio.h> # include <stdlib.h> typedef char ElemType ; typedef struct Node { ElemType data ; struct Node * next ; } LNode , * LinkList ; void CreatList ( LinkList & L , int m ) //依次输入m个数据,并依次建立各个元素结点,逐个插入到链表尾;建立带表头结点的单链表La { int i ; LinkList p , s ; L = ( LinkList ) malloc ( sizeof ( LNode ) ) ; L -> next = NULL ; p = L ; if ( m != 0 ) printf ( "请依次输入%d个数据元素:\n"

双向循环链表的实现

匿名 (未验证) 提交于 2019-12-02 22:56:40
版权声明:本文为博主原创文章,未经博主允许可以转载。 https://blog.csdn.net/killeri/article/details/82864218 其实双向循环链表与单链表的区别在于每个节点的结构发生了改变,具体的说是,每个节点多了一个指针域,用于指向上一个节点。其他的如链表对象就不需要进行改变了。 新的节点类: class LNode: def __init__(self, elem=0, prev=None, next_=None): self.prev = prev self.elem = elem self.next = next_ 实现代码大同小异: # 节点对象 class LNode: def __init__(self, elem=0, prev=None, next_=None): self.prev = prev self.elem = elem self.next = next_ # 加个下划线,为了区分python中的next关键字 class listObj: def __init__(self): self.rear = None self.nodenum = 0 # 接下来是一个链表类的实现(意思是:支持链表的一些特定的操作) class LinkedListUndeflow(ValueError): pass # 我们要知道