一、需求分析
功能需求:
设编号为1,2,…,n(n>0)个人按顺时针方向围坐一圈,每人持有一个正整数密码。开始时任意给出一个报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1报数;如此下去直到所有人全部出列为止。
界面需求:
输入人数n,每个人的密码和报数上限(初始密码)m,输出出列顺序
二、概要设计
建立线性表解决该问题:
(1) 建立表的储存结构,获取初始m的值
(2) 根据m的值查找出列数据元素的位置,删除该数据元素并获取新的m值
(3) 重复(2)直到表空
接口设计
void Ysfring(CycleLinkList L,int n,int m);//约瑟夫环
void InitList(CycleLinkList L);//初始化链表
bool ListInsert(CycleLinkList *L,int i,ElemType e); //在不带头结点的循环单链表中第i个数据元素之前插入新的数据元素e
void ListAppend(CycleLinkList *L,ElemType e); //在非空循环单链表表尾插入一个结点
数据结构设计
typedef struct ElemType{
//数据元素类型
int location;//位置
int password;//密码
}ElemType;
//循环链表
typedef struct CycleLinkList{
struct LNode *head;
struct LNode *tail;
}CycleLinkList,*CL;
//结点结构
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
三、详细设计
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct ElemType{
//数据元素类型
int location;//位置
int password;//密码
}ElemType;
//循环链表
typedef struct CycleLinkList{
struct LNode *head;
struct LNode *tail;
}CycleLinkList,*CL;
//结点结构
typedef