#include <iostream>
using namespace std;
const int MAXSIZE = 100;
//顺序表
/*无参构造,有参构造,析构,求顺序表长
按位查找,按值查找,
插入元素,删除元素,判断表为空
遍历顺序表*/
struct People
{
int age;
string name;
string gender;
};
template <class Element>
class SeqList
{
/*无参构造,有参构造,析构,求顺序表长
按位查找,按值查找,
插入元素,删除元素,判断表为空
遍历顺序表*/
public:
SeqList();
SeqList(Element a[], int n);
~SeqList();
int getLength();
Element getElement(int i);
int getLocate(Element x);
bool insert(int i, Element x);
Element delList(int del);
bool isEmpty();
void printList();
private:
Element data[MAXSIZE];
int length;
};
/*无参构造,有参构造,析构,求顺序表长
按位查找,按值查找,
插入元素,删除元素,判断表为空
遍历顺序表*/
template <class Element>
SeqList<Element>::SeqList() {
length = 0;
}
template <class Element>
SeqList<Element>::SeqList(Element a[], int n) {
if (n > MAXSIZE) throw "参数非法";
for (int i = 0; i < n; i++)
{
//this->Element ab[i] = Element a[i];
this->data[i] = a[i];
}
length = n;
}
template <class Element>
SeqList<Element>::~SeqList()
{
length = 0;
}
template <class Element>
int SeqList<Element>::getLength()
{
return length;
}
template <class Element>
Element SeqList<Element>::getElement( int i)
{
if (i< 1|| i>length) throw "查找位置非法";
//Element x;
//x = data[i - 1];
return data[i - 1];
}
template <class Element>
int SeqList<Element>::getLocate( Element x)
{
for (int i = 0; i < length; i++)
{
if (data[i].name == x.name&& data[i].age == x.age&& data[i].gender == x.gender)
{
return i + 1;
}
}
return -1;
}
template <class Element>
bool SeqList<Element>::insert(int i, Element x)
{
if (length >= MAXSIZE) throw "上溢";
if (i<1 || i>length + 1) throw"位置异常";
for (int j = length - 1; j >= i-1; j--)
{
data[j + 1] = data[j];
length--;
}data[i - 1] = x;
length++;
return 1;
}
template <class Element>
Element SeqList<Element>::delList(int del)
{
if (length == 0) throw "下溢";
if (del<1 || del>length) throw "删除位置错误";
Element x = data[del - 1];
for (int i = del; i < length ; i++)
{
data[i - 1] = data[i];
}
length--;
return x;
}
template <class Element>
bool SeqList<Element>::isEmpty()
{
if (length == 0) return 1;
else return 0;
}
template <class Element>
void SeqList<Element>::printList()
{
//for (int i = 0; i < length; i++)
//{
// cout << data[i].age << " " << data[i].name << " " << data[i].gender << endl;
//}
for (int i = 0; i < length; i++)
{
cout << data[i]<<"\t";
}
cout << endl;
}
//顺序表实现约瑟夫环
int main()
{
int m, n;//m为死亡密码,n为总人数
cout << "请输入游戏人数和死亡密码:" << endl;
cin >> n>>m;
int a[MAXSIZE];
for (int i = 0; i < n; i++)
{
a[i] = i + 1;
}
SeqList<int> l(a, n);
int j = 0;//死亡人数
int count = 0;//游戏计数
cout << "死亡顺序为:" << endl;
while (j < n - 2)
{
for (int i = 0; i < l.getLength(); i++)
{
count++;
if (count == m)
{
cout << l.getElement(i+1) << "\t";
l.delList(i+1);
count = 0;
j++;
i--;//顺序表删除,导致被删除位置之后的元素全部前移;调整i,避免跳过检索被删元素的下一个元素
if (j == n - 2) break;
}
}
}
cout << "\n通过死亡游戏的人为:" << endl;
l.printList();
return 0;
}