1.单向循环链表--约瑟夫环
约瑟夫环背景
死亡顺序如下
// 循环链表-瑟比夫环.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*模拟瑟比夫环,输出淘汰的顺序*/
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef int ElemType;
class Node
{
public:
Node* next;
ElemType data;
};
class YueList
{
public:
Node* head;
int length=0;
YueList();
Node* CreateCir(int n);
void KillNode(Node *newhead);
//bool TravList();
};
YueList::YueList()
{
head = new Node;
head->next = NULL;
head->data = 0;
}
Node* YueList::CreateCir(int n)
{
Node* p, * s=NULL; //bug, 指针s必须要初始化
int i = 1;
p = head;
while (i<=n)
{
s = new Node;
s->data = i++;
p->next = s;
p = s;
}
s->next = head->next;
delete head; //删除头结点
return s->next; //返回第一个节点的地址
}
void YueList::KillNode(Node *newhead)
{
Node* p,*q;
int m = 3;
p = newhead;
while (p!=p->next)
{
for (int i = 1; i < m-1; i++)
{
p = p->next;
}
q = p->next;
cout << q->data << "->";
p->next = q->next;
delete q; //删除第m个节点
p = p->next;
}
cout << p->data;
delete p;
}
/* 用于测试,遍历链表
bool YueList::TravList()
{
Node* p = head->next;
cout << "链表的元素为:";
while (1)
{
cout << p->data << " ";
p = p->next;
if (p == head->next)
{
break;
}
}
return true;
}
*/
int main()
{
YueList* L=new YueList();
Node* p = NULL;
int k = 0;
cout << "输入元素的个数:";
cin >> k;
p = L->CreateCir(k);
L->KillNode(p);
//L->TravList();
}
输出结果: