//约瑟夫环
//打印输出出圈人的编号
#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;
}
循环链表(约瑟夫环)
最新推荐文章于 2024-10-16 19:08:56 发布