C++实现约瑟夫环

#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;
}

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值