(数据结构约瑟夫环)
C语言实现约瑟夫环
题目背景
编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。现在给定一个随机数m>0,从编号为1的人开始,按顺时针方向1开始顺序报数,报到m时停止。报m的人出圈,同时留下他的密码作为新的m值,从他在顺时针方向上的下一个人开始,重新从1开始报数,如此下去,直至所有的人全部出列为止。
代码如下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct LNode
{
int num;
int pass;
struct LNode *next;
}LNode,*LinkList;
LinkList CreatList(int n)
{
LinkList L;
int i;
LNode *p1,*head;
p1=(LinkList)malloc(sizeof(LNode));
L=p1;
for(i=1;i<=n;i++)
{
p1->next=(LinkList)malloc(sizeof(LNode));
printf(“Enter %dth’s passport:”,i);
scanf("%d",&p1->next->pass);
p1->next->num=i;
p1=p1->next;
}
p1->next=L->next;
head=L->next;
delete L;
return head;
}
void DeleteElem(LinkList p3,int n,int m)
{
int i;
LinkList p;
while(p3->next!=p3)
{
for(i=1;i<m;i++)
{
p=p3;
p3=p3->next;
}
printf("%3d",p3->num);
m=p3->pass;
p->next=p3->next;
delete p3;
p3=p->next;
}
printf("%3d",p3->num);
delete p3;
}
int main(void)
{
LinkList head;
int n,m;
printf(“Enter the number of people:”);
scanf("%d",&n);
head=CreatList(n);
printf(“Enter m:”);
scanf("%d",&m);
printf(“Order:”);
DeleteElem(head,n,m);
printf("\n");
return 0;
}
本文介绍了一种使用C语言实现约瑟夫环的方法。具体地,文章详细阐述了如何通过链表结构来模拟约瑟夫环的问题,并提供了一个完整的代码示例,包括创建链表、删除元素和输出结果等功能。

5万+

被折叠的 条评论
为什么被折叠?



