12 链队列(带头结点)模板简单应用算法设计:猴子选大王

目的:使用C++模板设计链队列的抽象数据类型(ADT)。并在此基础上,使用链队列ADT的基本操作,设计并实现简单应用的算法设计。

内容:(1)请参照单链表的ADT模板,设计链队列的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考教材、课件,以及网盘中的单链表ADT原型文件,自行设计链队列的ADT。)

注意:链队列带头结点。

(2)ADT的简单应用:使用该ADT设计并实现应用链队列的算法设计。

应用:猴子选大王是一个小游戏,其规则是:假设n个猴子围成一堆,取数字m为将要被淘汰的数字,从第一个猴子开始数,数到数字m时,则该猴子出列,被淘汰,然后从被淘汰的猴子的下一个开始数,再数到数字m时,这个猴子也被淘汰,从下一个开始数,依次进行,直到剩下一个猴子结束。该猴子即猴子大王。

要求设计一个算法,使用链队列,设计并实现按照以上规则进行选择猴王的算法。为简单起见,直接输出猴王的序号即可,无需保存。

参考函数原型:

template<class ElemType>

void monkey_king( LinkQueue<ElemType> S, int n, int m );

输入说明 :

第一行:猴子的数目n

第二行:淘汰数字m

输出说明 :

第一行:猴王的序号

输入范例 :

30
4

输出范例 :

6

#include<iostream>
using namespace std;
struct student
{
	int data;
	student* next=NULL;
};
//student是结点
struct list
{
	student* front;
	student* end;
};
//list是由两个指针构成的结构体,相当于一个外圈结构体,里面可以包小的结构体,也就是节点student
void creat(list &a)
{
	a.front = a.end = new student;
	a.front->data = 0;
	int j = 0;
	cin >> j;
	for (int i = 0; i < j; i++)
	{
		student* p = new student;
		p->data = i + 1;
		a.end->next = p;
		a.end = p;
	}
	a.end->next = a.front->next;
}
//创建一个循环列表
void clear(list &a)
{
	student* x=a.front;
	int n = 0;
	cin >> n;
	while (x->next != x)
	{
		for (int i = 0; i < n-1; i++)
		{
			x = x->next;
		}
		x->next = x->next->next;
		
	}//把每次第n个删除

	if (x->next == x)
		cout << x->data <<" ";
	//然后输出答案
}

int main()
{
	list a;
	creat(a);
	clear(a);

	return 0;
	
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨骅麟(Patrick Young)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值