数据结构Ⅰ课程设计 约瑟夫环.docx

上传人:b****4 文档编号:11950286 上传时间:2023-04-16 格式:DOCX 页数:12 大小:74.26KB
下载 相关 举报
数据结构Ⅰ课程设计 约瑟夫环.docx_第1页
第1页 / 共12页
数据结构Ⅰ课程设计 约瑟夫环.docx_第2页
第2页 / 共12页
数据结构Ⅰ课程设计 约瑟夫环.docx_第3页
第3页 / 共12页
数据结构Ⅰ课程设计 约瑟夫环.docx_第4页
第4页 / 共12页
数据结构Ⅰ课程设计 约瑟夫环.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

数据结构Ⅰ课程设计 约瑟夫环.docx

《数据结构Ⅰ课程设计 约瑟夫环.docx》由会员分享,可在线阅读,更多相关《数据结构Ⅰ课程设计 约瑟夫环.docx(12页珍藏版)》请在冰豆网上搜索。

数据结构Ⅰ课程设计 约瑟夫环.docx

数据结构Ⅰ课程设计约瑟夫环

 

数据结构Ⅰ课程设计

 

约瑟夫环问题

 

2014年01月04日

目录

目录2

第1章问题描述3

第2章基本要求4

第3章概要设计5

3.1数据结构的设计5

3.2算法的设计6

3.3抽象数据类型的设计8

第4章详细设计10

4.1设计抽象数据类型对应的C++类的定义10

4.2设计每个成员函数11

4.3设计主函数12

第5章运行与测试13

5.1程序运行环境13

5.2测试数据及测试结果13

5.3程序运行结果截图16

第6章总结与心得17

参考文献18

附录程序源代码19

第1章问题描述

编号是1,2,3……n的n个人按照顺时针方向围坐一圈,每个人持有一个密码(正整数)。

一开始任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数。

报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。

设计一个程序来求出出列顺序。

第2章基本要求

1)建立数据模型,确定存储结构;

2)对任意n个人,密码为m,实现约瑟夫环问题;

3)出圈的顺序可以依次输出。

 

第3章概要设计

3.1数据结构的设计

解决此问题需要用到单链表的数据结构。

约瑟夫环问题,从确定的初报数开始进行,顺着这一方向向前如此循环,若能找到新的密码m所对应的数值则直接输出,若不能找到,继续向下依次寻找,直到找到密码m所对应的数值,再输出,如此循环。

约瑟夫环问题中的数据是人所在的位置,而这种数据存在“第一元素、最后元素”,并且存在唯一的前驱和后继,完全符合单链表的特点。

很显然,这需要应用单循环链表的知识。

单链表的基本思想就是用指针表示结点之间的逻辑关系,要确定指针变量p,结点p,指针p和L。

3.2算法的设计

按照模块进行划分:

(1)链表节点设计

structLnode{

intpwd;//密码

intbianhao;//编号

structLnode*next;

};

(2)采用头插法构造链表,由此必须倒着输入个人的密码和编号,由此可计一个线性表作为缓存暂时保存个人密码和编号。

a[n]=pwd。

n为编号,pwd为n的人的密码。

(3)将上述2中缓存的数据从a[n]到a[1]一次赋给链表L:

Lnode*L,*p;

L=newLnode;

L->next=NULL;

for(i=num;i>0;i--){

p=newLnode;

p->pwd=a[i-1];

p->bianhao=i;

p->next=L->next;

L->next=p;

}

(4)用循环模拟报数的过程

p=L;

while(num>0){

for(i=1;i

p=p->next;

if(p->next==NULL){

p->next=L->next;

}

}

Lnode*temp;

temp=p->next;

cout<bianhao<<"\n";

p->next=temp->next;

m=temp->pwd;

free(temp);

num--;

}

num是用来控制循环次数的变量,值为总人数n,每完成一次删除操。

即每有一个人出列,num减1。

循环中设置了中间变量temp用来存储要删除的结点的指针,以保证删除操作不会导致链表指针无法找到下一结点。

结束后free掉temp。

(5)删除结点,即找到出列对象的同时输出这个结点的数据域:

编号和密码!

3.3抽象数据类型的设计

采用类C语言定义相关的数据类型

structLnode

{

intpwd;//每个人持有的密码

intbianhao;//人员编号

structLnode*next;//指向下一个结点

};

第4章详细设计

4.1设计抽象数据类型对应的C++类的定义

(1)链表节点设计

structLnode{

intpwd;//密码

intbianhao;//编号

structLnode*next;

};

(2)将数据从a[n]到a[1](运用结点、链表指针)一次赋给链表L:

Lnode*L,*p;

L=newLnode;

L->next=NULL;

for(i=num;i>0;i--){

p=newLnode;

p->pwd=a[i-1];

p->bianhao=i;

p->next=L->next;

L->next=p;

}

(3)运用循环模拟报数过程

p=L;

while(num>0){

for(i=1;i

p=p->next;

if(p->next==NULL){

p->next=L->next;

}

}

Lnode*temp;

temp=p->next;

cout<bianhao<<"\n";

p->next=temp->next;

m=temp->pwd;

free(temp);

num--;

}

4.2设计每个成员函数

intpwd;

intbianhao;

structLnode*next;

将密码和编号存入程序中,通过结点指针对所需的数据进行调用。

Lnode*temp

找到出列对象的同时,输出这个结点的数据域,存储要删除结点,直到程序运行完毕。

4.3设计主函数

主函数

{

定义输入人数和密码

输入相应的初始报数

输入操作完成后,输出相应数据

}

第5章运行与测试

5.1程序运行环境

Windows7系统下在VC++6.0开发平台进行程序的运行与测试。

5.2测试数据及测试结果

数据1:

输入人数5,初次报数3,密码依次为:

26847,测试结果:

32154

数据2:

输入人数8,初次报数6,密码依次为:

34871645,测试结果:

64573128

数据3:

输入人数13,初次报数9,密码依次为:

4637982315758,测试结果:

91028131261137451

5.3程序运行结果截图

数据1:

程序清单

运行结果:

32154

 

数据2:

程序清单

运行结果:

64573128

数据3:

程序清单

运行结果:

91028131261137451

第6章总结与心得

我的这次数据结构课程设计的题目是《约瑟夫环问题》,通过对该题目的设计,使我加深了对数据结构的理解。

做什么事情,都要对认真,既然是该你做的事,肯定是你应该有这个能力,即使能力不够,也是应该借这个机会来培养。

所以放心大胆地做,对自己有信心,就有动力。

有人说,世上的事就怕认真二字。

确实,做什么,只是认真地去做,踏踏实实,戒躁戒躁,静静地思考,慢慢地进步,真的是天下无难事。

这就是我这次课程设计中得到的最大的体会,受益匪浅。

通过课程设计我的收获如下:

1、巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。

2、培养了我选用参考书,查阅手册及文献资料的能力。

培养独立思考,深入研究,分析问题、解决问题的能力。

3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。

4、通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。

根据我在课程设计中遇到得问题,我将在以后的学习过程中注意以下几点:

1、认真上好专业实验课,多在实践中锻炼自己。

2、写程序的过程中要考虑周到,严密。

3、认真的学习课本知识,并在此基础上学会灵活运用。

参考文献

[1]胡明,王涛等著.数据结构(C++版)[M].北京:

清华大学出版社,2011.

[2]谭浩强著.C程序设计(第四版)[M].北京:

清华大学出版社,2005.

[3]谭浩强著.C++程序设计[M].北京:

清华大学出版社,2004.

附录程序源代码

#include

usingnamespacestd;

structLnode{

intpwd;

intbianhao;

structLnode*next;

};

intmain()

{

inti=0;

intnum,m;

cout<<"输入人数:

"<<"\n";

cin>>num;

cout<<"输入初始报数:

"<<"\n";

cin>>m;

cout<<"输入密码:

"<<"\n";

inta[100];

for(i=0;i

cin>>a[i];

Lnode*L,*p;

L=newLnode;

L->next=NULL;

for(i=num;i>0;i--){

p=newLnode;

p->pwd=a[i-1];

p->bianhao=i;

p->next=L->next;

L->next=p;

}

p=L;

while(num>0){

for(i=1;i

p=p->next;

if(p->next==NULL){p->next=L->next;

}

}

Lnode*temp;

temp=p->next;

cout<bianhao<<"\n";

p->next=temp->next;

m=temp->pwd;

free(temp);

num--;

}

system("pause");

return0;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1