求用c语言编写约瑟夫环的程序

来源:百度知道 编辑:UC知道 时间:2024/06/24 00:58:44
最好再有:1) 需求分析
以无二义性的陈述说明程序设计的任务,程序要做什么?明确规定:
①输入的形式和输入值的范围;
②输出的形式;
③程序所能达到的功能;
④列出初步的测试计划。
2) 概要设计
说明本程序中用到的所有数据类型的定义及含义、主程序的流程以及各程序模块的功能要求及各自之间的层次(调用)关系。
3) 详细设计
实现概要设计中定义的所有数据类型,对每个操作需写出伪码算法;对主程序和其他模块也都要写出伪码算法;画出函数的调用关系图。
最终实现的源程序要按照良好风格的程序书写规则来编写,要求结构清晰,重点函数、重点变量以及重点功能部分要加上清晰的程序注释。
4) 调试分析
测试数据,测试输出的结果(包括正确的输入及其输出结果和含有错误的输入及其输出结果)。
每个模块设计和调试时存在问题的思考(问题是哪些?问题如何解决?)。
进行时间和空间复杂度分析,算法的改进设想。
5) 用户使用说明
说明如何使用最终发布的程序,详细列出每一步的操作步骤。
6) 测试结果
列出完备的测试结果,包括输入和输出。这里的测试数据应该完整和严格,最好多于需求分析中的初步测试计划。
7) 附录
程序文件名清单。
【问题描述】
编号为1,2… n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列顺序。
【基本要求】
1、利用单循环链表作为存储结构模拟此过程;
2、键盘输入总人数、初始报数上限值m及各人密码;
3、按照出列顺序输出各人的编号。
【测试数据】
m的初值为20;7个人的密码依次为:3,1,7,2,4,8,4。

#include<stdio.h>
struct list//建立一个结构体,包括每个人的编号,密码和下一级的指针
{
int id;
int code;
struct list *next;
};
typedef struct list list;//把结构体用list表示
list* input(int n)//链表的初始化
{
list *p,*q,*l;
int i,m;
p=new list;
l=new list;
l->next=NULL;
p=l;
p->id=1;//第一个人的初始化
scanf("%d",&m);
p->code=m;
for(i=2;i<=n;i++)//第二个人到第num个人的初始化
{
q=new list;
q->id=i;
scanf("%d",&m);
q->code=m;
q->next=NULL;
p->next=q;
p=q;
}
p->next=l;//使表尾指向表头,成循环链表
return p;
}
int main()
{
int num,m1,i;
list *q,*p;
while(scanf("%d",&num)!=EOF)
{
printf("第一次的密码为:");
scanf("%d",&m1);
p=input(num);
//printf("%4d\n",head->id);
printf("出队的顺序为:");