#include<stdio.h>
#include<iostream>
using namespace std;
#define ERROR -1
typedef int ElemType;
/*链式存储结构*/
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
/*初始化循环链表*/
void InitList(LinkList& L)
{
L = new LNode; //头结点指向头指针
if (L==NULL)
{
exit(ERROR);
}
L->data = 1;
L->next = L; //头结点的指针域指向自己
}
/*循环列表的插入操作(尾插)*/
void InsertList(LinkList&L, ElemType elem)
{
LinkList p = new LNode;
if (p==NULL)
{
exit(ERROR);
}
/*找到尾结点*/
LinkList end = L;
while (end->next!=L)
{
end = end->next;
}
p->data = elem; //创建数据为elem的结点
p->next = L;
end->next = p;
}
/*从List的start位置开始,删除其前面第i个位置的元素,并用实参e保存被删除的元素的值*/
void DeleteCircle(LinkList &L, int i, ElemType* e)
{
LinkList prior, q;
prior = L;
int j = 0;
while (j < i-1)
{
prior = prior->next;
j++;
}
q = prior->next;
*e = prior->next->data; //用实参e保存被删除的元素的值
prior->next = prior->next->next; //删除操作
delete q; //释放内存
}
/*循环链表的输出操作 求出循环链表的长度*/
void PrintList(LinkList L)
{
int count = 0;
LinkList p;
p = L;
do
{
count++;
printf("%d\n", p->data);
p = p->next;
} while (p!=L);
printf("循环链表的长度为:%d\n", count);
}
/*求出循环链表的长度*/
int CountList(LinkList L)
{
int count = 0;
LinkList p;
p = L;
do
{
count++;
p = p->next;
} while (p != L);
return count;
}
int main()
{
int number = 5; //人数
int count = 2; //数几个人
int data = 3; //开始的起点
ElemType loser = 0;
LinkList List;
InitList(List);
/*建立循环链表*/
for (int i = 2; i < number + 1; i++)
{
InsertList(List, i);
}
/*初始化开始*/
LinkList Start = List;
for (int i = 0; i < data - 1; i++)
{
Start = Start->next; //指向编号为3的人
}
/*游戏开始*/
while (CountList(Start)!=1)
{
PrintList(Start);
DeleteCircle(Start, count - 1, &loser);
PrintList(Start);
Start = Start->next; //每次淘汰都要从淘汰者下一个人开始
}
printf("最后的幸存者为:");
PrintList(Start);
return 0;
}
C++实现约瑟夫环
最新推荐文章于 2022-03-21 19:42:55 发布