链表:约瑟夫环

链表:约瑟夫环_第1张图片

#include
using namespace std;
struct Circle  //创建结构体Circle
{
	int index; //编号
	Circle* next; //指针变量next指向一个节点
};
Circle* CreateList(int n) //创建链表
{
	Circle* head, * p; //head为头指针,p为当前指针
	head = p = new Circle; //创建存储空间
	int i;
	for (i = 1; i < n; i++)
	{
		p->index = i; //进行编号
		p->next = new Circle; //为下一个节点创建存储空间
		p=p->next;  //指针变量p指向下一个节点
	}
	p->index = i; //对最后一个节点进行编号
	p->next = head; //最后一个节点时,指针变量p指向头指针
	return head; //返回头指针
}
Circle* DeleteNode(Circle* head, Circle* d) //删除节点
{   //head为头指针,d为指向需要删除节点的指针
	Circle* p = head; 
	while (p->next != d) p = p->next; //查找节点
	p->next = d->next; //前一个和后一个相连,跳过d
	delete d; //删除d所指向的节点
	return p; //返回p指针
}
Circle* NumberOff(Circle* head) //报数
{
	int k = 1;
	Circle* p = head; 
	while (p->next != p) //p的下一个节点不为p时,即不是只剩下一个节点时
	{
		k++; //继续报数
		p = p->next; 
		if (k % 3 == 0) //当报数为3的倍数时,退出圈子
			p = head = DeleteNode(head, p);//调用删除节点函数
	}
	return p; //返回指针p
}
int main()
{
	int n; //有n个人
	cin >> n;
	Circle* list = CreateList(n); //调用创建链表函数
	list = NumberOff(list); //调用报数函数
	cout << list->index << endl; //输出最后留下的一个人的编号
}

 链表:约瑟夫环_第2张图片

你可能感兴趣的:(链表,数据结构)