循环单链表实现约瑟夫环

n个人围成一圈报数,数到3的人出局:

//约瑟夫环
//循环链表实现
#include<stdio.h>
#include<stdlib.h>
typedef int elemtype;
typedef struct node{
	int num;          //序号
	                //elemtype data;    
	struct node *next;
}*linklist;

void Joseph(int n);
void Joseph(int n){
	linklist p, q, s;
	elemtype e;
	int countSum = n;//总计数
	int count = 1;
	s = (linklist)malloc(sizeof(node));//第一个节点
	if (!s) exit(0);
	s->num = 1;
	//s->data = 1;
	s->next = NULL;
	p = s; //q = s;
	for (int i = 2; i <= n; i++){
		q = (linklist)malloc(sizeof(node));
		q->num = i;
		//q->data = 1;
		p->next = q;
		q->next = NULL;
		p = q;
	}
	p->next = s;
	p = s->next;
	q = s;
	while (countSum> 2){
		p = p->next;
		q = q->next;
		count++;
		
		if (count == 2){
			q->next = p->next;
			e = p->num;
			printf("kill %d\n",e);
			free(p);
			p = q->next;
			count = 0;
			countSum--;
		}//if
	
	}//while
	printf("remain:\n");
	printf("%d->",p->num);//输出剩下的第1个元素
	p = p->next;
	printf("%d->", p->num);//输出剩下的第2个元素
}

void main(){
	int n;
	printf("输入参加人数:");
	scanf("%d",&n);
	Joseph(n);
	system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值