1. 实验目的及要求

目的:能够熟练掌握线性表的基本操作在顺序和链式两种存储结构上的实现,进一步理解线性表的逻辑结构和存储结构,提高使用理论知识指导解决实际问题的能力。

要求:1.建立数据模型,确定存储结构;

2.对任意人数、密码,都能实现约瑟夫环问题;

3.出圈顺序可以依次输出,也可以用一个数组输出。

  1. 实验步骤

1.实验问题分析

(1)由于当某个人退出圆圈后,报数的工作要从下一个人继续,剩下的人仍要围成一个圆圈,这个问题具有循环性质,考虑使用循环链表; 由于退出圆圈的这个指令对应着结点的删除操作,且这种删除操作使用频繁,考虑选择效率较高的链表结构;

循环链表的结点定义为如下结构类型:

创建一个长度为n的循环链表:

(2)由于退出圆圈的这个指令对应着结点的删除操作,于是定义了一个delete函数。在删除结点的时候考虑到几个特殊的情况,头尾结点。在删除第一个结点时,需要将head 指针下移,尾结点的next也需指向第二个结点;删除尾结点时,要将尾结点前的结点与第一个结点相连。当只剩下一个结点时,不需要删除,直接输出data的值。具体实现函数如下:

(3)主程序执行。主程序运行时,调用函数。

  1. 实验内容
  1. 从键盘输入整数n,通过create函数生成一个具有n个结点的循环链表。表中结点的编号依次为1,2,3,4,……

2.从键盘输入整数m(出圈数)和n(总人数)(1<=m<=n),从第1个结点开始计数为1,当计数到第m个结点时,输出该第m 结点对应的编号,将该结点从表中消除,并从输出结点的下一个结点开始计数器count重新计数到m,这样,不断重复进行计数,不断地输出,直到输出了这个链表的全部结点为止。

如,当n=8,m=3时,输出序列为:3,6,1,5,2,8,4,7。

3.代码的实现如下:

#include <iostream>#include <stdlib.h>#include <stdio.h>using namespace std;struct jd{int s;jd*next;};jd*creat(int array[],int n)//循环链表{jd*p,*head,*pe;//创建指针head=new jd;//创建空地址head->next=NULL;//置空pe=head;//将前指针置为头结点for(int i=0;i<n;i++)//创建n个长度的链表{p=new jd;//创建新节点p->next=NULL;//置空pe->next=p;//连接p->s=array[i];//赋值pe=p;}p->next=head;return head;}void delet(jd*head,int lo,int m)//删除第m个{jd*pe,*p;int count=1,sum=0;pe=head;p=head->next;while(lo!=0)//无元素时退出{if(p==head){pe=pe->next;p=p->next;}if(count==m)//删除等于m的节点{printf("第%-2d个出圈号数: %d号\n",++sum,p->s);pe->next=p->next;delete(p);p=pe->next;//将p的地址赋为下一个地址lo--;count=0;//重置}else{pe=pe->next;p=p->next;}count++;}}int main(){int n,m;int arr[1000];for(int i=0;i<n;i++)//编号{arr[i]=i+1;}cout<<"请输入总人数n及出圈数m:"<<endl;scanf("%d%d",&n,&m);jd* l=creat(arr,n);//调用上述方法delet(l,n,m);return 0;}

4.实验结果

5. 实验总结分析

通过这次实验,我进一步增强了对于链表的理解,也对链表的操作和实现更为熟悉。学习掌握了如何实现置空表、求表的长度、取结点、定位运算、插入运算、删除运算、建立不带头结点的单链表、建立带头结点的单链表、输出带头结点的单链表等操作。同时,通过查阅资料,请教同学,分析问题,解决问题,也锻炼了我实际操作时的动手能力。

数据结构约瑟夫环实验报告相关推荐

  1. 数据结c语言约瑟夫环实验报告,数据结构约瑟夫环实验报告.doc

    数据结构约瑟夫环实验报告.doc 数据结构与算法设计约瑟夫环实验报告实验一专业物联网工程班级物联网1班学号15180118姓名刘沛航一. 实验目的 1.熟悉VC环境,学习使用C语言利用链表的存储结构解 ...

  2. 计算机学院算法实验报告,四川大学计算机学院数据结构与算法分析实验报告

    四川大学计算机学院数据结构与算法分析实验报告 (61页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 21.9 积分 <数据结构与算法>课程设计 ...

  3. 数据结构与算法 实验报告一 约瑟夫环(单循环链表)

    实验内容: 约瑟夫环求解. 编号为1,2,....,N的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数).一开始任选一个正整数作为报数上限值M,从第一个人开始按顺时针方向自1开始顺序报数,报到M ...

  4. 数据结构—约瑟夫环问题(C语言版)

    目录 首先什么是约瑟夫环 约瑟夫环实现方式 一.创建结构体变量 二.初始化链表 三.构建循环链表 四.删除链表 五.完整代码及注释讲解 首先什么是约瑟夫环 约瑟夫环是循环链表中的一个经典问题:题目描述 ...

  5. 数据结构排序算法实验报告_数据结构与算法-堆排序

    堆排序 堆排序是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点,堆排序的时间复杂度为O(nlogn).( ...

  6. 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)

    我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...

  7. 数据结构第一次上机实验报告

    一.实验目的: 1.掌握c++调试线性表的基本操作方法. 2.掌握顺式与链式线性表的基本操作:插入,删除,查找等等. 3.如何改进程序的健壮性如何做到界面友好. 二.实验环境 vscode,g++编译 ...

  8. 数据结构与算法实验报告——实验一 链表

    实验一 链表 实验目的和要求 1.理解线性表的链式存储结构. 2.熟练掌握动态链表结构及有关算法的设计. 根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关 算法. 实验任务 1. 对任意 ...

  9. 燕山大学数据结构二级项目实验报告

    摘要 [摘  要]国际标准书号ISBN由13位数字组成.前三位数字代表图书,中间的9个数字分为三组,分表示组号.出版社号和书序号,最后一个数字是校验码从1968年英国的"标准书号" ...

最新文章

  1. 构造matlab决策树分类器,Matlab建立逻辑回归,决策树,SVM,KNN和朴素贝叶斯模型分类绘制ROC曲线...
  2. Openjudge-NOI题库-和为给定数
  3. .so 依赖目录 cmake_cmake浅析
  4. php中的全局异常,PHP的全局错误处理详解
  5. 【uni-app】H5中使用videojs播放器播放视频
  6. JMS学习七(ActiveMQ之Topic的持久订阅)
  7. C++ set的一些用法
  8. ncnn网络框架使用指南
  9. java 8和jdk区别_java-8 – JDK 6和JDK8之间的Java Collection差异
  10. 《小猪佩奇过大年》首映 导演解答“啥是佩奇”
  11. meshlab点云转mesh
  12. 未知错误 ID:-2147467259 操作必须使用一个可更新的查询
  13. 导出Excel支持锁定表头
  14. python渐变颜色表_python中带颜色渐变的图形
  15. hugo部署到Githut Pages
  16. 移动数字化平台原来可以这样帮企业打造协同生态链
  17. 生日祝福电子贺卡html5,电子生日祝福卡
  18. 【编程实践】Raft 算法的原理 go代码实例
  19. 【壁纸】kali linux 2021.1 自带原版壁纸分享
  20. TeKtronix TDS210数字示波器说明书

热门文章

  1. iOS开发之Documentation.build/Script-BC552B3A15.sh:
  2. 【蓝桥杯】2015初赛 三羊献瑞
  3. 依赖注入的正确打开方式 bilibili/kratos × google/wire
  4. 程序员怒怼外包公司HR:1万块钱还想招C语言开发,简直石乐志!
  5. 软件测试之补丁包测试
  6. 5V5联机对战游戏源码
  7. sass与scss的区别
  8. linux图片处理convert命令
  9. 绝对隐私:华为公司员工待遇全面揭秘(转)
  10. marquee详细属性