杭州电子科技大学
计算机学院
数据结构课程设计
设计题目:约瑟夫环问题
专 业 网络工程
班 级
学 号
姓 名 魏刘宏
指导教师 王立波
2012年12月28日
需求分析
1、问题描述 设编号为1,2,…,n(n>0)个人按顺时针方向围坐一圈,每人持有一个正整数密码。开始时任意给出一个报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1报数;如此下去直到所有人全部出列为止。
2基本要求 设计一个程序模拟此过程,给出出列人的编号序列。3、实现提示: 可考虑不带头结点的单链表结构4、测试数据: N=7,七个人的密码依次为3,1,7,2,4,8,4 初始报数上限值m=20。 ( 正确出列顺序为6,1,4,7,2,3,5 )
概要设计
链表存储结构的定义:
typedef struct Lnode
{} LNode, * LinkList;
LinkList CreatCycleList(int n)
创建无头节点的单向循环链表;
void print(LinkList L)
输出链表;
详细设计
#include
#include
typedef int ElemType;
typedef struct LNode{
ElemType data;
ElemType seq;
struct LNode *next;
} LNode, * LinkList;
LinkList CreatCycleList(int n){
//单向循环链表 ,无头节点;
LinkList La = (LinkList)malloc(sizeof(LNode));
ElemType a;
scanf("%d",&a);
La->data = a;
La->seq = 1;
LinkList q = La ;
for(int i=1; i < n; i++){
LinkList p = (LinkList)malloc(sizeof(LNode));
q->next = p;
scanf("%d",&a);
p->data = a;
p->seq = i+1;
p->next = La;
q=p;
}
return q; //指向尾节点,避免对第一个结点的操作失败;
}
void print(LinkList L)
{
LinkList p = L->next;
printf("%d ", p->data);
p = p->next;
while (p != L->next) //适应链表指针指向尾节点的情况
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main(){
printf("约瑟夫环 单向循环链表 \n\n");
int m,n,i,j;
printf("请输入人数: ");
scanf("%d",&n);
printf("请输入每个人的密码(%d个正整数):\n",n);
LinkList L = CreatCycleList(n);
LinkList pre = L;
//printf("初始站队为:\n");
//print(L);
printf("请输入初始报数上限值:\n");
scanf("%d",&m);
printf("\n出列顺序为:\n");
j = n;
while(j > 0){
for(i = 1; i < m; i++){
pre = pre->next;
}
m = pre->next->data;
printf("%d ",pre->next->seq);
pre->next = pre->next->next;
j--;
}
printf("\n\n");
return 0;
}
调试分析
这是我上数据结构课程设计这门课后做的第一个实验,所以开始时
开始时,我将代表链