约瑟夫环数据结构作业c++实现

文章目录


前言

 数据结构课作业自留bupt.

题目如下:

约瑟夫(Josephus)环问题:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,直到所有人全部出列为止。建立n个人的单循环链表存储结构,运行结束后,输出依次出队的人的序号。

[测试数据]

  m的初值为20;密码:3,1,7,2,4,8,4(正确的结果应为6,1,4,7,2,3,5)。

完整代码

关键部分

void Js(Node* tail,int n,int m) {
    int i = 0;
    Node* p = NULL;
    cout << "输出结果: ";
    while (n) {
        i = (i + 1) % m;
        if (i)
            tail = tail->next;
        else {
            p = tail->next;
            tail->next = p->next;
            cout << p->data << " ";
            m = p->password;
            free(p); //约瑟夫环删除结点,即淘汰人
            n--;
            i = 0;
        }
    }
}

完整代码如下

#include<iostream>
using namespace std;

typedef struct Node {
	int data;
	int password;
	struct Node* next;
}Node;

Node* Create(int n,int m) {	//创建循环单链表表示约瑟夫环
	Node* tail = NULL, * p=NULL;
	int a[7] = { 3,1,7,2,4,8,4 };		//测试数据
	for (int i = 0; i < n; ++i) {
		p = new Node;
		if (!tail) {//一开始tail为null的创建
			p->next = p;
			tail = p;	
			p->data = i + 1;
			p->password = a[i];
		}
		else { //tail不为null的创建
			p->data = i + 1;
			p->password = a[i];
			p->next = tail->next;
			tail->next = p;
			tail = p;//tail尾结点移动
			
		}
	}
	return tail;
}

void Js(Node* tail,int n,int m) {
	int i = 0;
	Node* p = NULL;
	cout << "输出结果: ";
	while (n) {
		i = (i + 1) % m;
		if (i)
			tail = tail->next;
		else {
			p = tail->next;
			tail->next = p->next;
			cout << p->data << " ";
			m = p->password;
			free(p); //约瑟夫环删除结点,即淘汰人
			n--;
			i = 0;
		}
	}
}

void main() {
	int n=7, m=20;	//人数和初始密码
	Node *tail;				 
	tail = Create(n,m);//创建环
	Js(tail, n, m); //进行游戏
}

总结

以上就是全部代码,具体细节我觉得值得推敲.

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值