觉得用静态循环链表最划算了。
1、动态链表要动态分配,指针移来移去,释放指针等等,弄得很烦,容易出错。
2、用循环链表是当然的了。
// DS: 似循环静态链表
#include <iostream>
#include <cstdio>
//#include <cstdlib>
using namespace std;
int Kill_You( const int sum = 1, const int distance = 1, const int start = 1)
{ // 一共参加自杀的人数有 sum 个,每 distence 个人就杀一个,从第 start 个人开始报数;
// 返回留下的那个人的位序
int pi = start - 1;
int pj = 0;
int *S = (int *)malloc( sum * sizeof(int) ); //不设头结点
if (!S)
cout << "Error!" << endl;
for (int i = 0; i < sum; i++) // 为人编号,第一个人为0
S[i] = i + 1;
S[sum - 1] = 0; // 尾结点与首元结点接上
cout << "依次杀掉:" << endl;
for (int count1 = sum - 1; count1--; )
{
for (int count2 = distance - 1; count2--; )
{
pj = pi; // pj跟踪pi,以便删除结点
pi = S[pi];
}
cout << pi + 1 << ' ';
// 杀掉下标是pi的那个人,即删除该结点
S[pj] = S[pi]; // pj是pi的前一个值
pi = S[pi];
}
free(S);
cout << endl;
return pi + 1;
}
int main()
{
int s; // s 表示总人数
int d; // d 表示每d个人就杀掉一个(杀掉说出d的那个人)
int k; // k 表示第k个人开始报数
while (1)
{
cout << "请输入人数(正整数):" << endl;
cin >> s;
cout << "请输入报数(正整数):" << endl;
cin >> d;
cout << "从第几个人开始报数:" << endl;
cin >> k;
printf( "留下第%d个人\n\n", Kill_You (s, d, k) );
}
return 0;
}
p.s. 没事多写写注释,挺好。
分享到:
相关推荐
循环链表 实现约瑟夫环 java 自己写的 测试通过 有注释
使用c语言中的循环链表及结构体实现约瑟夫环问题
通过循环链表实现约瑟夫环问题,用c语言实现。属于数据结构部分内容
约瑟夫环的队列和循环链表实现,实现基本功能
约瑟夫环的问题描述 问题描述:编号为1,2… n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,...
约瑟夫环,用循环链表实现,语言为Java。假设数到三的数出列。程序输出1到10的出列顺序。
用循环链表的方式实现约瑟夫环,下面是部分代码, typedef struct node { int key; int seatnum; struct node *next; }node,*linklist; void createlist(linklist&l,int n) { l=(linklist)malloc(sizeof(node));...
数据结构问题,编程实现约瑟夫环,原题是严淑敏的《数据结构C语言版题集》实习一的第二题
单向循环链表实现约瑟夫环.zip
一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部...
是最简单的约瑟夫环代码 结构简单易懂 保证你会满意的呀
单链表解决约瑟夫环问题
约瑟夫环的循环链表实现
约瑟夫环求解,循环链表的使用,经典问题
约瑟夫环的循环链表实现,这个程序比较完整,有需要做试验的请速速下载。
约瑟夫环的简单实现,采用循环链表的方式实现。
VC++采用单向循环链表实现约瑟夫环,希望和大家共勉。
Josephus约瑟夫问题的循环链表实现.cpp
数据结构大作业,c++用双向链表实现约瑟夫环,内含.h与.cpp