【数据结构】实践作业:加里森的任务

这篇具有很好参考价值的文章主要介绍了【数据结构】实践作业:加里森的任务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

零、效果展示

【数据结构】实践作业:加里森的任务,数据结构,链表,c++,c语言

一、题目要求

        有n个加里森敢死队的队员要炸掉敌人的一个军火库,谁都不想去,队长加里森决定用轮回数数的办法来决定哪个战士去执行任务。规则如下:如果前一个战士没完成任务,则要再派一个战士上去。现给每个战士编一个号,大家围坐成一圈,随便从某一个编号为x的战士开始计数,当数到y时,对应的战士就去执行任务,且此战士不再参加下一轮计数。如果此战士没完成任务,再从下一个战士开始数数,被数到第y时,此战士接着去执行任务。以此类推,直到任务完成为止。
        加里森本人是不愿意去的,假设加里森为1号,请你设计一程序为加里森支招,求出n,x,y满足何种条件时,加里森能留到最后而不用去执行任务。

要求:
(1)主要数据结构采用链式结构存储。
(2)自拟实验实例验证程序正确性,并讨论n,x,y之间的关系。

二、需求分析

任务描述

设计一个程序解决加里森的任务问题。该问题要求根据给定的条件(n、x、y),找出使加里森不用去执行任务的组合。具体规则如下:

  • 有 n 个加里森敢死队的队员要炸掉敌人的一个军火库。
  • 每个队员都有一个编号,编号从 1 到 n。
  • 以编号为 x 的战士为起始点,从1开始循环数数,每数到第 y 个战士,该战士将去执行任务。
  • 如果某个战士执行任务失败,则会重新开始数数,直到任务完成为止。
  • 加里森本人是不愿意去执行任务的,他的编号永远为1。

输入要求

  • 输入形式:通过命令行或交互界面输入 n、x、y 的值。
  • 输入值的范围:n、x、y 均为正整数,且满足 1 <= x <= n,1 <= y <= 2*n(自定义)。

输出要求

  • 输出形式:输出符合条件的 x 和 y 的组合。
  • 输出内容:程序将输出满足条件的 x 和 y 值,使得加里森不用去执行任务。

功能描述

  • 程序能够根据输入的 n、x、y 值,计算出使加里森不用去执行任务的组合。
  • 程序能够处理正确的输入,并输出符合条件的 x 和 y 值。
  • 程序能够处理错误的输入,并给出相应的错误提示或处理方式。

测试数据

  • 正确的输入数据:例如 n=5,y=2,期望输出为 x=6。
  • 错误的输入数据:例如 n=0,期望输出为错误提示或处理方式。

二、 概要设计

思路概述

  • 使用链表结构模拟加里森的任务问题,每个节点代表一个队员,节点之间通过指针连接成环形链表。
  • 设计函数来初始化链表、删除节点、打印链表等操作,根据规则模拟任务执行过程,找出符合条件的 x 和 y 的组合。

数据结构定义

  • 定义链表节点结构体 LinkNode,包含数据 data 和指向下一个节点的指针 next

主程序流程

  1. 提供交互式界面,让用户输入 n、x、y 的值。
  2. 根据用户输入的值调用相应的函数进行计算和处理。
  3. 输出符合条件的 x 和 y 的组合,或者输出错误提示信息。

程序模块层次关系

  • 主程序模块:负责处理用户输入、调用相应函数、输出结果。
  • 初始化链表模块:负责创建空链表和添加节点。
  • 模拟模块:根据规则进行模拟运行并删除节点。
  • 输出结果模块:根据计算结果输出符合条件的 x 和 y 的组合,或者输出错误提示信息。

三、详细设计

主体思路

主函数 main
  |
  |--> function//面向用户的交互模块
         |
         |--> Garrison_x//基于(n,y)求解(x)
         |      |--> x++
         |            |--> CreateHeadNode + InitList//初始化n人链表
         |                    |--> DeleteNode
         |                    |--> PrintList
         |
         |--> Garrison_x_y//基于(n)求解(x,y)
         |      |-->  x++
         |             |-->  y++
         |                    |--> CreateHeadNode + InitList//初始化n人链表
         |                            |--> DeleteNode
         |                            |--> PrintList

 结构体定义

//定义节点结构体
typedef struct linknode {
	int data;
	struct linknode* next;
}LinkNode;

函数定义

LinkNode* CreateHeadNode(void);//创建头结点
void CreateNewNode(LinkNode* H,int data);//创建元素节点
void PrintList(LinkNode* H);//打印链表
void DeleteNode(LinkNode* H, int num);//删除节点
void InitList(LinkNode* H,int num);//初始化链表

void Garrison_x(int n, int y, int isPrt);//固定n,y求x
void Garrison_x_y(int n, int isPrt);//固定n求x,y

void function();//面向用户的交互模块

执行函数

void Garrison_x(int n, int y, int isPrt)//固定n,y求x
{
	for (int x = 1; x <= n; x++)
	{
		//根据n值初始化链表
		LinkNode* H = CreateHeadNode();
		pre = H;
		InitList(H, n);

		if (isPrt) PrintList(H);//打印初始化后的链表

		for (int j = 0; j < x-1; j++)//将pre指向上次执行者的前一个人
			pre = pre->next;

		while (H->data > 1)//当前链表剩余元素个数>1?继续进行删除操作:退出
		{
			DeleteNode(H, y);
			if (isPrt) PrintList(H);
		}
		if (H->next->data == 1)//如果1号(加里森)活了下来
			printf("\n*** x = %d ***\n\n", x);
		else//似了
			if (isPrt) printf("x = %d is wrong\n", x);
	}
}

void Garrison_x_y(int n, int isPrt)//固定n求x,y
{
	for (int x = 1; x <= n; x++)
	{
		for (int y = 1; y <= 2 * n; y++)//设置y的上限是2n,可根据需求进行修改
		{
			LinkNode* H = CreateHeadNode();
			pre = H;
			InitList(H, n);
			if(isPrt) PrintList(H);		
			for (int j = 0; j < x-1; j++)
				pre = pre->next;
			while (H->data > 1)
			{
				DeleteNode(H, y);
				if (isPrt) PrintList(H);
			}
			if (H->next->data == 1)
				printf("\n*** x = %d  y = %d***\n\n", x,y);
			else
				if (isPrt) printf("x = %d  y = %d is wrong\n", x,y);
		}
	}
	
}

交互模块

void function()
{
	int func = 0;
	int isPrt = 0;
	int n, x, y;
	printf("\n请输入想要执行的功能('1'表示(n,y)->(x),'2'表示(n)->(x,y),'0'表示退出程序):" );
	scanf_s("%d", &func);
	switch (func) {
		case 0:
			exit(0);
		case 1:
			printf("\n请输入n=");
			scanf_s("%d", &n);
			printf("\n请输入y=");
			scanf_s("%d", &y);
			if (n <= 0 || y <= 0)
			{
				printf("输入不合法,请重新输入");
				break;
			}
			printf("\n请选择打印模式('1'表示'全过程','0'表示'精简'):");
			scanf_s("%d", &isPrt);
			Garrison_x(n, y, isPrt);
			break;
		case 2:
			printf("\n请输入n=");
			scanf_s("%d", &n);
			if (n <= 0)
			{
				printf("输入不合法,请重新输入");
				break;
			}
			printf("\n请选择打印模式('1'表示'全过程','0'表示'精简'):");
			scanf_s("%d", &isPrt);
			Garrison_x_y(n, isPrt);
			break;
		default:
			printf("\n输入错误!请检查输入");
			break;
	}
		
}

四、 调试分析报告

时间复杂度

        对于(n,y)->x,当固定n与y时,对于每一个x,删除节点操作执行n-1次,每次删除会移动工作指针y次,时间复杂度为O(n^2*y)。

        对于(n)->(x,y),当固定n,再固定x时,对于每一个y,删除节点操作执行n-1次,每次删除会移动工作指针y次,时间复杂度为O(n^4)。

空间复杂度

        链表操作的空间复杂度为O(n)

发现

        当(n)->(x,y)时,xy的对数与y的取值范围相同。换句话说,当n一定时,对于任意的y,都能找到唯一确定的x与之对应。

五、用户使用说明

  • 运行程序后,程序将会显示如下提示信息:
请输入想要执行的功能('1'表示(n,y)->(x),'2'表示(n)->(x,y),'0'表示退出程序):
  • 根据提示输入想要执行的功能对应的数字,例如输入 1表示执行 (n,y)->x 的功能。

  • 根据程序提示依次输入相关参数:

    • 对于功能 1,需要依次输入 n 和 y 的值,确保输入的值大于 0。
    • 对于功能 2,需要输入 n 的值,确保输入的值大于 0。
  • 如果输入的值不合法(小于等于 0),程序将会提示重新输入。

  • 程序会根据输入的参数执行相应的功能,并输出结果或过程。

  • 如果需要继续测试或执行其他功能,可以重复上述操作进行。

  • 如果需要退出程序,可以输入 0 并按回车键退出。文章来源地址https://www.toymoban.com/news/detail-848608.html

六、 测试结果

mode:(n,y)->(x) simply 
input:n=-1,y=3
output:

    输入不合法,请重新输入
mode:(n,y)->(x) simply 
input:n=10,y=3
output:

    *** x = 7 ***
mode:(n,y)->(x) all
input:n=3,y=1
output:

    List:   1       2       3
    List:   1       3
    List:   1

    *** x = 1 ***

    List:   1       2       3
    List:   1       2
    List:   2
    x = 2 is wrong
    List:   1       2       3
    List:   2       3
    List:   3
    x = 3 is wrong
mode:(n)->(x,y) simply
input:n=6
output:

    *** x = 1  y = 3***

    *** x = 1  y = 5***

    *** x = 2  y = 1***

    *** x = 3  y = 2***

    *** x = 3  y = 4***

    *** x = 3  y = 7***

    *** x = 3  y = 9***

    *** x = 4  y = 6***

    *** x = 4  y = 11***

    *** x = 5  y = 8***

    *** x = 5  y = 12***

    *** x = 6  y = 10***

到了这里,关于【数据结构】实践作业:加里森的任务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构与算法分析 第六章 图 作业讲解

     参考教材: 《数据结构(C语言版 第2版)》 严蔚敏,李冬梅,吴伟民编著,人民邮电出版社,2022年版。 截图未标明出处均为原创或取自《数据结构(C语言版 第2版)》~   本文对应的作业题讲解视频:   数据结构与算法分析作业讲解视频合集 https://www.bilibili.com/video/BV1N

    2024年02月03日
    浏览(45)
  • HNU数据结构与算法分析-作业1-算法分析

      1. (简答题) 1.(教材3.4)(a)假设某一个算法的时间代价为 ,对于输入规模n,在某台计算机上实现并完成该算法的时间为t秒。现在另有一台计算机,运行速度为第一台的64倍,那么t秒内新机器上能完成的输入规模为多大? 2.(教材3.12) 写出下列程序段平均情况下时间代

    2024年02月05日
    浏览(44)
  • 2022BUAA数据结构期末大作业的一些想法

            本文写的内容可能在很多巨佬看来属实是一些简单的废话,但我的底子比较薄,很多东西都是想了好久,这篇文章的主要目的实际上也只不过是把我的一些改进的地方记录下来,防止以后忘记。。。 百度、谷歌等互联网搜索引擎提供高效的网页、文档搜索功能,

    2024年02月10日
    浏览(52)
  • 22级数据结构大作业地铁订票系统c++

    内容需求:  参考图中郑州地铁一号线部分线路图设计一个地铁订票系统。 【问题描述】 订票管理系统应实现地铁站的插入、删除、修改、查询、排序以及票价查询等工作,请设计一个计算 机系统,实现上述功能。 【基本要求】 (1)使用合适的数据结构存储地铁站数据并

    2024年01月24日
    浏览(38)
  • 「数据结构」第四次作业(2023春 - 银行排队模拟)

    这道题比较难,单独拿出来说。 先再看一遍题目: 题干描述: 【问题描述】 一个系统模仿另一个系统行为的技术称为 模拟 ,如飞行模拟器。模拟可以用来进行方案论证、人员培训和改进服务。计算机技术常用于模拟系统中。 生产者-消费者 (Server-Custom)是常见的应用模式

    2024年02月01日
    浏览(49)
  • 数据结构与算法大作业——四叉树自适应模糊

    能够正确的对图像建立四叉树; 对于输入的图像,四叉树能够输出模糊的结果 对颜色相近的区域进行模糊 可通过十六进制编辑器 010editor 打开查看二进制信息 官网获取 010editor 信息 含义 P6 指明PPM的编码格式 2156 2156 图像大小为2156*2156 255 RGB的每个色彩值范围为0~255 C0 91 89(

    2024年01月19日
    浏览(36)
  • 数据结构与算法分析 第五章 树和二叉树 作业讲解

     参考教材: 《数据结构(C语言版 第2版)》 严蔚敏,李冬梅,吴伟民编著,人民邮电出版社,2022年版。 截图未标明出处均为原创或取自《数据结构(C语言版 第2版)》~   本文对应的作业题讲解视频:   数据结构与算法分析作业讲解视频合集 https://www.bilibili.com/video/BV1N

    2024年02月02日
    浏览(37)
  • 学堂在线数据结构(上)(2023春)邓俊辉 课后作业错题整理

    CTRL+F可进行页面搜索~૮꒰ ˶• ༝ •˶꒱ა The reverse number of a sequence is defined as the total number of reversed pairs in the sequence, and the total number of element comparisons performed by the insertion sort in the list of size n is: 一个序列的逆序数定义为该序列中的逆序对总数,规模为n的列表中插入排序进行

    2024年02月16日
    浏览(44)
  • 数据结构基础:P3-树(上)----编程作业02:List Leaves

    本系列文章为浙江大学陈越、何钦铭数据结构学习笔记,系列文章链接如下 : 数据结构(陈越、何钦铭)学习笔记 题目描述: 给定一棵树,按照从上到下、从左到右的顺序列出所有叶结点。 输入格式: 每个输入文件包含一个测试用例。对于每种情况,第一行给出一个正整数

    2024年02月11日
    浏览(62)
  • 二叉树的基本操作-C语言实现-数据结构作业

    目录  (1)二叉树的创建; (2)二叉树的先序、中序和后序遍历输出; (3)输出二叉树的叶子节点和度为2的节点的数量; (4)输出二叉树的深度; (5)将二叉树所有节点的左右子树互换(左子树变右子树,右子树变左子树); (6)参考书上,二叉树按层次输出(一行输出一层); (7)删除二

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包