IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构约瑟夫环实验报告 -> 正文阅读

[数据结构与算法]数据结构约瑟夫环实验报告

  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. 实验总结分析

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

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-06 15:30:49  更:2021-12-06 15:31:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:25:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码