湖北理工黄石理工数据结构实验 设计性实验3约瑟夫环的实现.docx
- 文档编号:4885034
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:14
- 大小:141.47KB
湖北理工黄石理工数据结构实验 设计性实验3约瑟夫环的实现.docx
《湖北理工黄石理工数据结构实验 设计性实验3约瑟夫环的实现.docx》由会员分享,可在线阅读,更多相关《湖北理工黄石理工数据结构实验 设计性实验3约瑟夫环的实现.docx(14页珍藏版)》请在冰豆网上搜索。
湖北理工黄石理工数据结构实验设计性实验3约瑟夫环的实现
设计性实验3约瑟夫环的实现
实验课程名:
数据结构
专业班级:
09计科
(1)班学号:
******姓名:
******
实验时间:
2010.11.26实验地点:
k4---206指导教师:
祁文青
一.
实验任务:
设有n个人围坐一圈,用整数序列1,2,3,……,n表示顺序围坐在圆桌周围的人,现从某个位置s上的人开始报数,数到m的人出列,接着从出列的下一个人又从1开始重新报数,数到m的人出列,如此下去,直到所有人都出列为此。
试设计确定他们的出列次序序列的程序。
如n=8,m=4,s=1时,设每个人的编号依次为1,2,3,…开始报数,则得到的出列次序为4,8,5,2,1,3,7,6。
二.实验任务的子任务:
(1)采用数组表示作为求解过程中使用的数据结构。
(2)采用单向循环链表作为存储结构模拟整个过程,循环链表可不设头节点,必须注意空表和非空表的界限。
本人设计约瑟夫环中的数据类型为字符,采用switch语句选择两种不同存储结构数组或单向循环链表实现约瑟夫环。
三.算法分析(如图):
1、数组
1
2
Out
3
前移
4
5
out
6
7
1
out
2
3
前移
4
5
6
out
8
Out2
1
Out4
Out3
Out1
2
3
4
B、单向循环链表
四.源代码:
1、用数组实现约瑟夫环:
inta[9999];
charb[9999];
intN,m,s;
intn,i,j=0,flag;
cout<<"请输入总人数N:
"< cin>>N; if(N<0) { cout<<"输入总人数不能为负值,请重新输入总人数N: "< cin>>N; }; cout<<"给的人数附上字符: "< for(i=0;i { cin>>b[i]; a[i]=b[i]; printf("a[%d]=%c\n",i,b[i]); } cout<<"请输入从第几位开始报数m: "< cin>>m; /*if(m>N) { m=m%N; }*/ m=m-1; cout<<"请输入出列位数s: "< cin>>s; for(i=0;i { if(N==1)/*当只剩一个人,直接输出*/ cout<<(char)a[0]; else { flag=(m+s-1)%N; cout<<(char)a[flag]; cout<<""; for(j=flag;j a[j]=a[j+1]; m=flag; N=N-1;/*补完空缺,总人数减一*/ } } cout< } 2、用单向循环链表实现约瑟夫环: typedefintElemType; typedefstructLNode { ElemTypeData; structLNode*next; }LNode,*LinkList; LinkListInit_LinkList(void); LinkListp,q; inti=0; intN,s,m; p=Init_LinkList(); cout<<"请输入从第几个人开始报数: "; cin>>m; cout<<"请输入出列位数s"; cin>>s; while(i! =m-1) { p=p->next; i++; } for(i=1;p->Data! =(p->next)->Data;) { if(i==s) { q=p->next; p->next=(p->next)->next; cout< cout<<""; i=1; } else { p=p->next; i++; } } cout< }; LinkListInit_LinkList(void) { LinkListH,p,q;inti,N; cout<<"请输入总人数N: "< cin>>N; H=(LinkList)malloc(sizeof(LinkList)); if(H) H->next=NULL; else { cout<<"Overflow! "< return0; } for(i=1;i<=N;i++) { p=(LinkList)malloc(sizeof(LinkList)); H->next=p; if(i==1)q=H->next; H=H->next; H->Data=i; } H->next=q; returnH; } 3.约瑟夫环的输出方式: A、数组实现约瑟夫环的输出: for(i=0;i { if(N==1) cout<<(char)a[0]; else { flag=(m+s-1)%N; cout<<(char)a[flag]; cout<<""; for(j=flag;j a[j]=a[j+1]; m=flag; N=N-1; } } B、数组实现约瑟夫环的输出: for(i=1;p->Data! =(p->next)->Data;) { if(i==s) { q=p->next; p->next=(p->next)->next; cout< cout<<""; i=1; } else { p=p->next; i++; } } cout< 运行结果: A、数组实现约瑟夫环的输出: B、数组实现约瑟夫环的输出: 五.提问与回答: 1.老师提问: 可否将字符型改成字符串来区分里面的元素? 回答: 上述代码做如下更改: #include"iostream.h" #include"stdlib.h" #include"malloc.h" #include"stdio.h" #include"string.h" typedefintElemType; typedefstructLNode { ElemTypeData; structLNode*next; }LNode,*LinkList; LinkListInit_LinkList(void); voidmain() { cout<<"请选择用哪种形式处理约瑟夫环问题(A表示用数组,B表示用数组): "< charz; cin>>z; switch(z) { case'A': { chara[9999][100]; //charb[9999][100]; intN,m,s; intn,i,k,j=0,flag; cout<<"请输入总人数N: "< cin>>N; if(N<0) { cout<<"输入总人数不能为负值,请重新输入总人数N: "< cin>>N; }; n=N; cout<<"给的人数信息: "< for(i=0;i scanf("%s",a[i]); cout<<"请输入从第几位开始报数m: "< cin>>m; /*if(m>N) { m=m%N; }*/ m=m-1; cout<<"请输入出列位数s: "< cin>>s; for(i=0;i { if(N==1) cout< else { flag=(m+s-1)%N;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 湖北理工黄石理工数据结构实验 设计性实验3 约瑟夫环的实现 湖北 理工 黄石 数据结构 实验 设计 约瑟夫 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)