1.顺序存储
/*
程序运行后首先要求用户输入初始报数m,人数n,(设n≤10)。
上述程序中顺序存储的插入(或删除)操作,链式结构上的插入(或删除)操作。
*/
#include<iostream>
#define MAXSIZE 10//人数上限
using namespace std;
typedef int DataType;
typedef struct {
DataType data[MAXSIZE];//存放编号的数组
int length; //人数
}SeqList, *PSeqList;
//判断顺序表是否存在
void exist(PSeqList L) {
if (!L) {
cout << "表不存在!";
return;
}
}
//创建顺序表
PSeqList InitList() {
PSeqList L = new SeqList[MAXSIZE]; //指针指向结构体
cout << "请输入总人数(小于10):";cin >> L->length;
for (int i = 0; i < L->length; i++) {
L->data[i] = i + 1;
}
return L;
}
//删除顺序表第i个元素
void ListDelete(PSeqList L, int i) {
for (int j = i ; j <= L->length; j++) {
L->data[j - 1] = L->data[j]; //被删除元素之后的前移
}
--L->length; //表长-1
}
//约瑟夫
void Joseph(PSeqList L, int m) {
int j = 1;
int s1 = 0; //第s个人对应的数组下标
cout << "最后顺序为:" ;
for (int i = L->length; i > 0; i--) {
s1 = (s1 + m - 1) % i;//出列人的下标
cout << L->data[s1] << " ";
ListDelete(L, s1 + 1);//在数组中删除出列人
}
cout << endl;
}
int main() {
//函数声明
void exist(PSeqList L);
PSeqList InitList(void);
void ListDelete(PSeqList L, int i);
void Joseph(PSeqList L, int m);
PSeqList L = InitList();//创建环
int m;//计数值
cout << "请输入初始报数:"; cin >> m;
Joseph(L, m);
system("pause");
return 0;
}
2.链式存储
#include<iostream>
using namespace std;
//循环链表
struct Node
{
int data;
Node* next;
};
int main()
{
int m, n;
cout << "请输入初始报数:"; cin >> m;
cout << "请输入总人数(小于10):"; cin >> n;
if (m > 0 && n > 0)
{
Node *p, *H, *s;
Node* head = new Node;
head->data = 1;
head->next = NULL;
p = H = s = head;
for (int i = 2; i <= n; i++)
{
p = new Node;
p->data = i;
s->next = p;
s = s->next;
}
p->next = H; //最后一个数据的尾部地址指向头 形成循环
H = p; //H指向数据最后一个
p = p->next; //p指向数据第一个
cout<<"最后顺序为:";
while (p != H) //当p没有到最后一个时
{
for (int i = 1; i < m; i++)
{
H = p; //H指向p
p = p->next; //p指向下一个
}
cout << p->data << " ";
H->next = p->next; //删除p节点
delete p;//free p;
p = H->next;
}
cout << p->data << endl;
delete p;
}
else
cout<<"输入错误!";
system("pause");
return 0;
}