注:解决约瑟夫环问题的函数,编写时要注意:
1. 根据密码m点人数实际上只需要点到第m-1人,才好让第m人出列。
2.对循环链表跑圈点数时,实际上头结点不能算人数。可以通过求余减少跑圈人数。如果是双向循环,还可以考虑逆向点数。
3.找到第m-1人后,next如果是头结点,说明要出列的是首元,不能让头结点出列了。
//=====================================people.h
struct People
{
int id;
int password;
};
//相关操作原型
//=====================================people.cpp
//对People类型数据,实现基本的输入输出
void input(People *px)
{
}
void output(People *px)
{
}
//或通过重载操作符:>>和<<,实现基本的输入输出
ostream & operator << ( ostream &out, const People &x )
{
}
istream & operator >> ( istream &in, People &x )
{
}
//链表数据结构的实现,
//===========================================list.h
typedef
struct node
{
ElemType data;
struct node *next;
} Node;
typedef
struct
{
Node *head; //头指针
int count; //元素个数
} List;
//相关操作原型
//============================================list.cpp
//链表的基本操作
//1.初始化
//2.添加元素
//3.删除元素
//4.遍历输出?
//============================================main.cpp
#include "people.h"
typedef People ElemType; //确定链表容器真正容纳的数据类型
#include "list.h"
int main()
{
//创建链表
//根据约瑟夫问题原则,利用链表基本操作,解决问题。可做出独立函数
}