2344049封其业joseph环.docx

上传人:b****0 文档编号:17307938 上传时间:2023-07-24 格式:DOCX 页数:12 大小:145.26KB
下载 相关 举报
2344049封其业joseph环.docx_第1页
第1页 / 共12页
2344049封其业joseph环.docx_第2页
第2页 / 共12页
2344049封其业joseph环.docx_第3页
第3页 / 共12页
2344049封其业joseph环.docx_第4页
第4页 / 共12页
2344049封其业joseph环.docx_第5页
第5页 / 共12页
2344049封其业joseph环.docx_第6页
第6页 / 共12页
2344049封其业joseph环.docx_第7页
第7页 / 共12页
2344049封其业joseph环.docx_第8页
第8页 / 共12页
2344049封其业joseph环.docx_第9页
第9页 / 共12页
2344049封其业joseph环.docx_第10页
第10页 / 共12页
2344049封其业joseph环.docx_第11页
第11页 / 共12页
2344049封其业joseph环.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

2344049封其业joseph环.docx

《2344049封其业joseph环.docx》由会员分享,可在线阅读,更多相关《2344049封其业joseph环.docx(12页珍藏版)》请在冰点文库上搜索。

2344049封其业joseph环.docx

2344049封其业joseph环

滨江学院

《数据结构》课程设计

题目joseph环

学号20102344049

姓名封其业

专业软件工程

指导教师

组号

 

 

一、问题描述

任务:

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

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

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

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

要求:

利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。

测试数据:

m的初值为20,n=7,7个人的密码依次为3,1,7,2,4,7,4,首先m=6,则正确的输出是什么?

要求:

输入数据:

建立输入处理输入数据,输入m的初值,n,输入每个人的密码,建立单循环链表。

输出形式:

建立一个输出函数,将正确的输出序列

二、需求分析

利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。

首先创建一个空链表,初始化链表,构造出一个只有头结点的空链表,建立好一个约瑟夫环。

1.输入的形式和输入值的范围

  本程序中,输入报数上限值m和人数上限l,密码,均限定为正整数,输入的形式为一个以“回车符”为结束标志的正整数。

2.输出的形式

  从屏幕显示出列顺序。

3.程序功能

  提供用户从键盘输入,Joseph约瑟夫环的必要数据,并显示出列顺序。

三、概要设计

以单向循环链表实现该结构。

1.抽象数据类型的定义为:

ADTLNode

{

数据对象Daiai∈CharSeti12…nn≥0

数据关系R1ltai-1aigtai∈DI2…n

基本操作

InitListLinkListL

操作结果构造一个空的线性链表L。

DestroyListLinkListL

初始条件线性链表L已存在。

操作结果销毁线性链表L。

ListLengthLinkListL

初始条件线性链表L已存在。

操作结果返回线性链表L的长度。

ListEmptyLinkListL

初始条件线性链表L已存在。

操作结果若线性链表L为空表则返回True否则返回False。

GetElemLinkListLpos

初始条件线性链表L已存在。

操作结果若1posLengthL则返回表中第pos个数据元素。

LocateElemLinkListLeq初始条件线性链表L已存在。

操作结果若线性链表L中存在元素e则q指示L中第一个值为e的元素的位置并返回函数值True否则q指示第一个大于e的元素的前驱的位置并返回函数值False

AppendLinkListLe初始条件线性链表L已存在。

操作结果在线性链表L的末尾插入元素e。

InsertAfterLinkListLqe初始条件线性链表L已存在q指示L中一个元素。

操作结果在线性链表L中q指示的元素之后插入元素e。

ListTraverseqvisit初始条件线性链表L已存在q指示L中一个元素。

操作结果依次对L中q指示的元素开始的每个元素调用函数visit。

}

ADTLNode

由于上面已经确定用单向循环链表来存储JOSEPH环,所以现在定义一下的数据结构来存储JOSEPH环。

定义linklisthead为头指针,用来调用链表中的数据。

本程序共包含3个函数

1)主函数main

2)创建JOSEPH环函数creat3输出JOSEPH环函数shuchu各函数关系:

3)各函数关系:

主程序模块→有序表单元模块→输出函数模块

4、详细设计

(1)抽象数据类型

Adtlist{

数据对象:

D={ai|ai∈ElemSet,2,…,n,n>=0}

数据关系:

R1=|ai-1,a∈D,i=2,…,n}

基本操作:

statusCreateList_Circle(member**q_head,intn)

操作结果为构造一个空循环链表*L

statusOutNode(member**qq)

初始条件为线性循环链表存在,操作结果为输出出对队列并删除选择对象

}ADTList

(2)定义结构体类型

其中password为密码,No为序号,将两者均定义为整型,LNode*next为下一成员指针,具体算法如下:

typedefstructLNode

{

intpassword;

intNo;

structLNode*next;

}member;

typedefintstatus;

(3)主函数模块算法

程序main中调用了CreateList_Circle函数,创建了循环链表,还调用了OutNode函数实现了输出。

首先定义人数n,头指针即首员地址和遍历指针均为空,当输入人数小于等于0时,输出“重新输入”字样,如果输入数大于0则创建循环链表,返回头指针。

当m小于等于0时也提示重新输入,把head附给q,寻找出列成员,化简m值,k从1到m-1指向出列成员,然后修改m,删除链表的出列成员,成员数自减。

具体算法如下:

statusmain()

{

intn,m;

member*head=NULL,*q=NULL;

while(n<=0)

printf("nmustbepositive,pleaseenteragain:

\n");

if(!

CreateList_Circle(&head,n))

returnOVERFLOW;

while(m<=0)

printf("mmustbepositive,pleaseenteragain:

\n");

p=head;,

while(n>=2)

{

intk;

m=(m%n==0)?

n:

m%n;

for(k=1;i

p=p->next;

m=p->password;

OutNode(&q);

n--;

}

returnOK;

}

(4)创建链表模块算法

创建一个无头结点的循环链表,结点数n,*q_head返回链表头指针即首结点地址

statusCreateList_Circle(member**p_head,intn)

{

inti;

member*tail,*p;

*p_head=(member*)malloc(sizeof(member));

if(!

(*p_head))returnOVERFLOW;

(*p_head)->No=1;

printf("PleaseenterpasswordofNo.1:

\n");

scanf("%d",&(*p_head)->password);

tail=*p_head;

tail->next=NULL;

for(i=2;i

{

p=(member*)malloc(sizeof(member));

if(!

p)returnOVERFLOW;

p->No=i;

printf("PleaseenterpasswordofNo.%d:

\n",i);

scanf("%d",&(p->password));

tail=p;

}

tail->next=*p_head;

returnOK;

}

(5)输出模块算法

此算法删除链表中的结点*qq,操作实质是将*qq下一结点复制到*qq后将其释放。

具体算法如下:

statusOutNode(member**qq)

{

member*p;

(*qq)->password=((*qq)->next)->password;

(*qq)->No=((*qq)->next)->No;

p=(*qq)->next;

(*qq)->next=(*qq)->next->next;

free(p);

returnOK;

}

 

流程图:

创建链表:

五、源代码

#include

#include

typedefstructNode

{

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

intnum;//这个人的编号

structNode*next;//指向下一个节点

}Node,*Link;

voidInitList(Link&L)//创建一个空的链表

{

L=(Node*)malloc(sizeof(Node));

if(!

L)exit

(1);

L->key=0;

L->num=0;

L->next=L;

}

voidCreater(intn,Link&L)//初始化链表

{

Linkp,q;

q=L;

for(inti=1;i<=n;i++)

{

p=(Node*)malloc(sizeof(Node));

if(!

p)exit

(1);

printf("thekey_%dis:

",i);

scanf("%d",&p->key);

p->num=i;

L->next=p;

L=p;

}

L->next=q->next;

free(q);

}

voidmain()

{

LinkL,p,q;

intn,x;

L=NULL;

InitList(L);//构造出一个只有头结点的空链表

printf("pleaseinputthetotlenumberofpeople:

");

scanf("%d",&n);//总共的人数n

printf("thestartkeyis:

");

scanf("%d",&x);//初始密码为x

Creater(n,L);//建立好一个约瑟夫环

p=L;

for(inti=1;i<=n;i++)

{

for(intj=1;j

p=p->next;

q=p->next;

x=q->key;

printf("%d",q->num);

p->next=q->next;

free(q);

}

}

五、测试数据

m的初值为20,n=7,7个人的密码依次为3,1,7,2,4,7,4,首先m=6,

(正确的出列顺序应为6,1,4,7,2,3,5)

1.运行界面:

2.输入测试数据:

3.运行结果:

6、设计总结

我的这次数据结构课程设计的题目是:

《joseph环》通过对题目的设计,我加深了了对数据结构及储存结构的理解,进一步地理解和掌握了课本中所学的各种数据结构,尤其是对单链表、单循环链表上基本运算的实现,学会了如何把学到的东西用于解决实际问题,锻炼了自己的动手能力。

通过这次数据结构课程设计,我感受最深的就是对于单链表,单循环链表,结构体等的使用,可以说对单链表,单循环链表有了比以前更进一步地认识,以前只是一知半解,如果只给个题目自己根本不知道怎么把程序完整的编出来,所以这次课程设计最大的收获就在于对循环表有一定的理解,包括其中的一系列操作,如建立一个单链表,循环列表,建一个结构体,删除链表中的结点,增加结点等。

   在其中我学习到了很多平时书本上没有的东西,积累了经验,锻炼了自己分析问题,解决问题的能力,并学会了如何将所学的各课知识知识融会,组织起来进行学习。

总之我学到的很多,受益匪浅。

 

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

当前位置:首页 > 法律文书 > 判决书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2