约瑟夫环.cpp

来自「编号1,2,...n的n个人按顺时针方向围坐在一圈,每人持有一个密码.一开始任选」· C++ 代码 · 共 63 行

CPP
63
字号
#include<stdio.h>
#include<malloc.h>
typedef struct LNode{//构建结构体
	int password;//该人拥有的密码
	int num;//该人的编号
	struct LNode *next;
}LNode,*LinkList;

LinkList CreatLNode(int m){//构建m个人不含头结点的循环链表,并返回头指针
	int i;
	LinkList p_pri,p_cur,head;
	head=p_pri=p_cur=(LinkList)malloc(sizeof(LNode));
	printf("输入第1个人的密码:");
	scanf("%d",&p_cur->password);p_cur->num=1;
	for(i=1;i<m;i++){
		p_cur=(LinkList)malloc(sizeof(LNode));
		printf("输入第%d个人的密码:",i+1);
		scanf("%d",&p_cur->password);p_cur->num=i+1;
		p_pri->next=p_cur;
		p_pri=p_cur;
	}
	p_cur->next=head;
	return head;
}

void Cycle(LinkList L,int total,int place){//约瑟夫环的循环过程,同时输出出列的顺序号
	LinkList p_cur,p_pri,p;
	int i;
	p_pri=p_cur=p=L;
	while(total-->0)//每出列一个人,人的总数就少一
	{   
		i=1;  
        p_cur=p;
		while(i++<place)//查找要出列的结点,用p_cur表示要出列的结点
		{
			p_pri=p_cur;
			p_cur=p_cur->next;
		}
		printf("%5d",p_cur->num);//输出当前结点的编号
		place=p_cur->password;
		p_pri->next=p_cur->next;
		p=p_cur->next;
		free(p_cur);//释放已经出列的结点
	}
	printf("\n");
	return;	
}

void main()
{
	int n,k;
	LinkList L;
	printf("报数的总人数n:");
	scanf("%d",&n);
	if(n<=0) return;//不合法的n的值
	else   L=CreatLNode(n);
	printf("初始报数起始值k:");
	scanf("%d",&k);
	printf("出列的顺序为:");
	Cycle(L,n,k);
	return;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?