智博数据结构——约瑟夫问题

约瑟夫问题

例题:N个人围成一个圆形(联想循环链表),首先第一个人从1开始一个人一个人顺时针报数,报到第M个人,令其出列。然后再从下一个人从1顺时针报数,报道第M个人,在令其出列,如此下去,求出列顺序。

假设m=8,n=3

循环链表https://mp.csdn.net/postedit/85985566

#include "CircleLinkList.h"
#include <stdio.h>
#define  M 8
#define  N 3
typedef struct MUNUM
{
	CircleLinkNode node;
	int val;
}MyNum;

void Myprint(CircleLinkNode*data)
{
	MyNum*num = (MyNum*)data;
	printf("%d ", num->val);
}
int MyComare(CircleLinkNode*data1, CircleLinkNode*data2)
{
	MyNum*num1 = (MyNum*)data1;
	MyNum*num2 = (MyNum*)data2;
	if (num1->val==num2->val)
	{
		return CIRCLELINKLIST_TRUE; //CIRCLELINKLIST_TRUE=1
	}
	return CIRCLELINKLIST_FALSE;//CIRCLELINKLIST_FALSE=0
}
int main()
{
	CircleLinkList *list = Init_CircleLinkList();
	//插入
 	MyNum num[M];
 	for (int i = 0; i < 8;i++)
 	{
 		num[i].val = i + 1;
 		insert_CircleLinkList(list, i, (CircleLinkNode*)&num[i]);
 	}
	//打印
 	Print_CircleLinkList(list, Myprint);
	printf("-------------------\n");
	int index = 1;
	//辅助指针
	CircleLinkNode * pCurrent = list->head.next;
	while ( Size_CircleLinkList(list)>1)
	{
		if (index ==N)
		{
			MyNum* temNum = (MyNum*)pCurrent;
			printf("%d", temNum->val);
			//缓存待删除节点的下一个节点
			CircleLinkNode*pNext = pCurrent->next; // 将pCurrent下一个节点赋值给pNext为了进行判断此时的pNext是否是头节点
			//根据值删除
			RemoveByValue_CircleLinkList(list, pCurrent, MyComare);
			pCurrent = pNext;
			if (pCurrent ==&(list->head))
			{
				pCurrent = pCurrent->next;
			}
			index = 1;
		}
		
		pCurrent = pCurrent->next;
		if (pCurrent == &(list->head))
		{
			pCurrent = pCurrent->next; //若当前节点头节点,直接跳过指向下一个节点
		}

		index++;
	}
	if (Size_CircleLinkList(list) ==1)
	{
		MyNum* temp=(MyNum*)Front_CircleLinkList(list);
		printf("%d", temp->val);
	}
	else
	{
		printf("error");
	}
	//FreeSpace_CircleLinklist(list);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值