数据结构与算法 实验报告一 约瑟夫环(单循环链表)
实验内容:
约瑟夫环求解。
编号为1,2,....,N的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值M,从第一个人开始按顺时针方向自1开始顺序报数,报到M时停止报数。报M的人出列,将他的密码作为新的M值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。利用单向循环链表存储结构模拟此过程,按照出列的顺序打印出每个人的编号。
测试数据示例:
若M的初值为20;N=7;7个人 的密码依次为:3,1,7,2,4,8,4,M初值为6(正确的出列顺序应为6,1,4,7,2,3,5)。
实现提示:
程序运行后,首先要求用户指定初始报数的上限值,然后读入每个人的密码。可设n<=30,循环链表不需要头结点,请注意空表和非空表的区别。
基本要求:
1、写出完成实验内容的实验方法和源代码。
2、写出实验数据及运行结果。
3、写出在实验过程中所遇到的问题及解决办法。
实验思路
以下是源代码
#include<stdlib.h>
#include<stdio.h>
typedef struct LinkList {int password;int number;//顺序struct LinkList* next;
}LinkList;
LinkList CreatList(int N)//创建链表
{int i;LinkList* node, * end, * p = {};//普通节点 尾结点 指向第一个节点的指针end = (LinkList*)malloc(sizeof(LinkList));if (end != NULL){for (i = 0; i < N; i++){node = (LinkList*)malloc(sizeof(LinkList));if (i == 0){p = node; //p指向第一个数据节点,没有头节点}if (node != NULL){printf("这是第%d次输入\n", i + 1);scanf("%d", &node->password);fflush(stdin);node->number = i + 1;//输入密码的同时为每个节点加入顺序end->next = node;end = node;//尾插法}}end->next= p;}if(p!=NULL)return *p; //返回第一个数据节点
}
int* JosephRingKiller(LinkList List, int M, int N)//返回值类型是一个指针(动态数组)
{int i,j;int temp = M;int* Sequence = (int*)calloc(N,sizeof(int));//储存顺序if (Sequence != NULL){LinkList* Ring = &List;//指针Ring指向链表for (j = 0; j < N; j++){for (i = 1; i < temp-1; i++){Ring = Ring->next;}if (temp == 1)//当密码为1时{Sequence[j] = Ring->number;Ring = Ring->next;}else{Sequence[j] = Ring->next->number; //找到要删除的节点的前一个节点temp = Ring->next->password; //这里删不删除节点都可以,不过不删除节点操作比较麻烦LinkList *p = Ring->next;Ring->next = p->next;Ring = Ring->next;free(p);}}}return Sequence; //返回储存顺序的数组
}
int main()
{int M, N;int i;printf("请输入报数的上限值M\n");scanf("%d", &M);printf("请输入报数的人数N\n");scanf("%d", &N);int* Sequence = (int*)calloc(N,sizeof(int));//储存顺序if (Sequence != NULL){printf("请输入每个人的密码(密码长度<=30)\n");LinkList Password = CreatList(N);Sequence = JosephRingKiller(Password, M, N);printf("出列顺序为:");for (i = 0; i < N; i++){printf("%d ", Sequence[i]);}printf("\n");}
}
测试数据
第一组:报数上限M=20,人数N=7,密码:3 1 7 2 4 8 4
输出 6 1 4 7 2 3 5
第二组:报数上限M=31,人数N=10,密码 4 5 9 4 2 1 3 8 7 1
输出 1 5 7 10 2 3 4 6 8 9
实验总结
1.本次实验还可以用循环队列来做
2.求顺序的函数代码部分还可以继续优化一下
数据结构与算法 实验报告一 约瑟夫环(单循环链表)相关推荐
- 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)
我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...
- 数据结构与算法实验报告——实验一 链表
实验一 链表 实验目的和要求 1.理解线性表的链式存储结构. 2.熟练掌握动态链表结构及有关算法的设计. 根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关 算法. 实验任务 1. 对任意 ...
- 数据结构排序算法实验报告_数据结构与算法-堆排序
堆排序 堆排序是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点,堆排序的时间复杂度为O(nlogn).( ...
- 计算机学院算法实验报告,四川大学计算机学院数据结构与算法分析实验报告
四川大学计算机学院数据结构与算法分析实验报告 (61页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 21.9 积分 <数据结构与算法>课程设计 ...
- c语言编写队列元素逆置,数据结构与算法实验—利用栈逆置队列元素.doc
数据结构与算法实验-利用栈逆置队列元素 利用栈逆置队列元素实验报告 通信1204班 谢崇赟 实验名称 利用堆栈将队列中的元素逆置 实验目的 会定义顺序栈和链栈的结点类型. 掌握栈的插入和删除结点在操作 ...
- 实验题目:约瑟夫环问题:设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,m为任意一个正整数。从第一个人开始顺时针方向自1起顺序报数,报到m时停止并且报m的人出列,再从他的下一个人
实验题目:约瑟夫环问题:设编号为1,2,3,--,n的n(n>0)个人按顺时针方向围坐一圈,m为任意一个正整数.从第一个人开始顺时针方向自1起顺序报数,报到m时停止并且报m的人出列,再从他的下一 ...
- c语言数组排序算法的实验总结,排序算法实验报告技术总结.doc
数据结构实验报告八种排序算法实验报告 实验内容编写关于八种排序算法的C语言程序,要求包含直接插入排序.希尔排序.简单选择排序.堆排序.冒泡排序.快速排序.归并排序和基数排序.实验步骤 各种内部排序算法 ...
- c语言三元组稀疏矩阵的转置实验报告,稀疏矩阵三元组实现矩阵转置算法实验报告.doc...
稀疏矩阵三元组实现矩阵转置算法实验报告.doc 1实验三稀疏矩阵的三元组表示实现矩阵转置算法学院专业班学号姓名一.实习目的1掌握稀疏矩阵的三元组顺序表存储表示:2掌握稀疏矩阵三元组表示的传统转置算法的 ...
- c语言des算法实验报告,C语言实现DES算法实验报告解析.doc
C语言实现DES算法实验报告解析 xx工程大学 实验报告 (2015-2016学年第一学期) 报告题目: DES加密算法 课程名称: 密码学B 任课教员: 专 业: 学 号: 姓 名: 二O一六年一月 ...
最新文章
- 程序员求职之道(《程序员面试笔试宝典》)之面试官箴言?
- mysql安装 linux 5.6,Linux安装MySql5.6版详细教程
- 使用easyexcel导出
- IOS 4.0 以上版本 home键退出 后台执行代码
- SpringBoot新版
- 随记:我们需要怎样的数学教育?
- c 语言 strcmpy的实现
- PHPCMS怎么创建单选按钮、复选框,并在模板里怎么接收和调用。
- 苹果系统中英文输入法切换_苹果输入法怎么切换_苹果系统如何切换输入法-win7之家...
- GSOAP 在一个客户端内调用多个服务出现的问题解决
- 软件工程的国家标准(总结)
- 华硕天选2 WLAN不可用解决办法
- 还儿童一个健康上网环境,正式开启我的路由器URL网址白名单之旅
- 阿里云大数据分析师(ACP)认证,该如何备考?
- 算法---逆向旋转矩阵法求解矩阵绕圈走
- 滴滴23届校招薪资正式开奖!算法岗最高 55w
- pdf 批量翻译-批量翻译照片
- 百度飞桨第一天学习笔记
- Windows保护模式(五)任务段任务门
- oracle中include,impdpexpdp的content和include选项