循环链表(约瑟夫环)

//约瑟夫环
//打印输出出圈人的编号 
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	int data;
	struct node* next;
}node;
node*  CreatList(int n){
	node* headNode=(node*)malloc(sizeof(node));
	if(headNode==NULL){
		printf("分配失败!\n");
		return 0;
	}
	node* p=headNode;
	for(int i=1;i<=n;i++){
		p->data=i;
		if(i<n)      //前n-1次申请下一个结点 
		{
			p->next=(node*)malloc(sizeof(node)); //给下一个结点申请内存 
			p=p->next;    //让p向后移一位用于下一次遍历 
		}
		else p->next=headNode; //第n次让尾节点指向头节点 
	}
	return headNode;
}
int Joseph(node* headNode,int n,int k){
	//next指向本身的时候说明就剩一个人未出圈
	while(headNode->next!=headNode){
		node* p=headNode; //用p遍历链表
		for(int i=1;i<=k-2;i++){  //通过循环让p指向被删除的数的上一个结点 
			p=p->next;   //让p->next指向要出圈的人 
		} 
		node* q=p->next;  //用q暂存要出圈的人,防止丢失 ,(q指向要删除的节点) 
		printf("%d ",q->data);  
		p->next=p->next->next;
		free(q);
		headNode=p->next;  //让头节点指向出圈人的下一个结点 
	} 
	return headNode->data; //返回最后出圈人的编号 
}
int main(){
	int n,k;
	scanf("%d %d",&n,&k);
	node* headNode=CreatList(n); //一共多少人 
	printf("%d",Joseph(headNode,n,k)); //n个人数到k的人出局 
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值