C语言约瑟夫环
我写了一个约瑟夫环问题的程序,但是不会分析和画流程图,有没有高手能帮我看一下对不对,然后分析一下画个流程图。谢了!...
我写了一个约瑟夫环问题的程序,但是不会分析和画流程图,有没有高手能帮我看一下对不对,然后分析一下画个流程图。谢了!
展开
1个回答
2013-11-28
展开全部
约瑟夫环
a) 问题描述:Joseph问题的一种描述是:编号为1、2、……、n的n个人按顺时针方向围坐一
圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开
始顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,
从他在顺时针方向的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设
计一个程序求出出列顺序。
b) 基本要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
c) 测试数据:m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先报m的人
为6(正确的出列顺序应为6,1,4,7,2,3,5)。
实现提示:程序运行后,首先要求用户指定初始报数上限值,然后读取各人的密码。可设n <=30。
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;int num;
struct LNode *next;
}LNode,*LinkList;
void CreateList_L(LinkList *L,int n)
{ int i=0;
ElemType e;
LinkList p,q;
*L=(LinkList)malloc(sizeof(LNode));
(*L)-> next=NULL;(*L)-> data=n;
q=*L;
while(i <n)
{ scanf("%d",&e);
p=(LinkList)malloc(sizeof(LNode));
p-> data=e;p-> num=i+1;
p-> next=NULL;
q-> next=p;
q=p;
i++;
}
p-> next=(*L)-> next;
}
void PrintList(LinkList L)
{ int i=0;
LinkList p;
p=L-> next;
while(i <L-> data)
{
printf("%5d",p-> data);
p=p-> next;
i++;
}
printf("\n");
}
void Put(LinkList *L)
{ int i,m;LinkList p,q;
printf("input a number:\n");
scanf("%d",&m);
q=(*L)-> next;
while((*L)-> data)
{for(i=0;i <m-1;i++)
{p=q;
q=q-> next;
}
printf("%5d",q-> num);
m=q-> data;
p-> next=q-> next;
free(q);
q=p-> next;
(*L)-> data=(*L)-> data-1;
}
}
void main()
{LinkList L;
int a;
printf("请输入人数:");
scanf("%d",&a);
printf("请输入密码:");
CreateList_L(&L,a);
printf("您输入的数字为:\n");
PrintList(L);
Put(&L);
}
a) 问题描述:Joseph问题的一种描述是:编号为1、2、……、n的n个人按顺时针方向围坐一
圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开
始顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,
从他在顺时针方向的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设
计一个程序求出出列顺序。
b) 基本要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
c) 测试数据:m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先报m的人
为6(正确的出列顺序应为6,1,4,7,2,3,5)。
实现提示:程序运行后,首先要求用户指定初始报数上限值,然后读取各人的密码。可设n <=30。
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;int num;
struct LNode *next;
}LNode,*LinkList;
void CreateList_L(LinkList *L,int n)
{ int i=0;
ElemType e;
LinkList p,q;
*L=(LinkList)malloc(sizeof(LNode));
(*L)-> next=NULL;(*L)-> data=n;
q=*L;
while(i <n)
{ scanf("%d",&e);
p=(LinkList)malloc(sizeof(LNode));
p-> data=e;p-> num=i+1;
p-> next=NULL;
q-> next=p;
q=p;
i++;
}
p-> next=(*L)-> next;
}
void PrintList(LinkList L)
{ int i=0;
LinkList p;
p=L-> next;
while(i <L-> data)
{
printf("%5d",p-> data);
p=p-> next;
i++;
}
printf("\n");
}
void Put(LinkList *L)
{ int i,m;LinkList p,q;
printf("input a number:\n");
scanf("%d",&m);
q=(*L)-> next;
while((*L)-> data)
{for(i=0;i <m-1;i++)
{p=q;
q=q-> next;
}
printf("%5d",q-> num);
m=q-> data;
p-> next=q-> next;
free(q);
q=p-> next;
(*L)-> data=(*L)-> data-1;
}
}
void main()
{LinkList L;
int a;
printf("请输入人数:");
scanf("%d",&a);
printf("请输入密码:");
CreateList_L(&L,a);
printf("您输入的数字为:\n");
PrintList(L);
Put(&L);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询