版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1/1数据结构课程设计>
课
程
设
计
班级:111004
姓名:董丽美
学号:111004122
指导老师:史延新
完成日期:2023_07_10
题目一:约瑟夫环问题
【问题描述】约瑟夫(Joseph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开头任选一个正整数作为报数上限值m,从第一个人开头按顺时针方向自1开头挨次报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开头重新从1报数,如此下去,直至全部人全部出列为止。试设计一个程序求出列挨次。【基本要求】利用单向循环链表存储结构模拟此过程,根据出列的挨次打印出各人的编号。
【测试数据】m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m值为6(正确的出列挨次应为:6,1,4,7,2,3,5)
一.需求分析
1.用单循环链表存储并遍历及删除节点的方法,计算并输出约瑟夫环的问题。
2.环中总人数和节点信息由用户输入,且均为正整数。3.在窗口界面输出出列挨次的编号。
二.概要设计
1.设定链表的抽象数据类型定义:
ADTList{
数据对象:D={a(i)|a(i)∝Elemset,i=1,2,…,n,n>=0}
数据关系:R1={|a(i-1),a(i)∝D,i=2,…,n}基本操作:
InitList(&L)
操作结果:构造一个空的线性表
ListInsert(&L,i,e)
初始条件:线性表L已经存在。
操作结果:在L中第i个位置之前插入新的数据元素e,L的长度增加1。
ListDelete(&L,i,&e)
初始条件:线性表L已经存在且非空,1
#include
typedefstructNODE
{
intcode;
intnum;
NODE*pnext;
}NODE;
typedefstructCIRCLE_LINK
{
NODE*front;
NODE*rear;
}CIRCLE_LINK;
boolinit_circle_link(CIRCLE_LINK**link){
*link=(CIRCLE_LINK*)malloc(sizeof(CIRCLE_LINK));
if(NULL==*link)
{
returnfalse;
}
(*link)->front=NULL;
(*link)->rear=NULL;
returntrue;
}
boolinsert_circle_link_end(CIRCLE_LINK*link,intcode,intnum)
{
NODE*curt=NULL;
curt=(NODE*)malloc(sizeof(NODE));
if(NULL==curt)
{
returnfalse;
}
curt->num=num;
curt->code=code;
if(NULL==link->front)
{
link->front=curt;
link->rear=link->front;
link->rear->pnext=link->front;
}
else
{
curt->pnext=link->rear->pnext;
link->rear->pnext=curt;
link->rear=curt;
}
returntrue;
}
voiddelete_node(CIRCLE_LINK*link,NODE*pcurt){
NODE*ptem=link->front;
NODE*prear=link->rear;
while(true)
{
if(link->front==link->rear
link->rear=NULL;
break;
}
if(link->front==pcurt)//删除头结点
{
link->front=link->front->pnext;
link->rear->pnext=link->front;
free(pcurt);
pcurt=NULL;
break;
}
ptem=ptem->pnext;
if(ptem->pnext==pcurt
link->rear=ptem;
free(pcurt);
pcurt=NULL;
break;
}
if(ptem->pnext==pcurt)//删除中间节点
{
ptem->pnext=pcurt->pnext;
free(pcurt);
pcurt=NULL;
break;
}
}
}
voidfind_key(CIRCLE_LINK*link,intkey){
NODE*pcurt=link->front;
NODE*ptem=NULL;
inti=1;
printf("输出序列为:\n");
while(link->front!=NULL)
{
for(;ipnext;
}
i=1;
printf("%d\n",pcurt->num);
key=pcurt->code;
ptem=pcurt;
pcurt=pcurt->pnext;
delete_node(link,ptem);
}
}
intmain(intargc,char*argv){
inti=0;
intn=0;
intnum=1;
intcode=0;
intkey=0;
CIRCLE_LINK*link=NULL;
init_circle_link(
printf("请输入总人数:");
scanf("%d",
getchar;
for(i=0;ivertex=to;//建立顶点内容
newnode->nextnode=NULL;//设定指标初值
ptr=//顶点位置
while(ptr->nextnode!=NULL)//遍历至链表尾ptr=ptr->nextnode;//下一个顶点
ptr->nextnode=newnode;//插入结尾
}
}
4、初始化顶点坐标
数组名称:intnode[60][2]
数组功能:此为顶点坐标,主要用来读取存储在文件中的各个顶点坐标信息
详细代码:
intnode[60][2]={{1,10},{10,1},{2,10},{10,2},{2,3},{3,2},{3,4},{4,3},
{3,12},{12,3},{4,13},{13,4},{4,5},{5,4},{5,6},{6,5},{5,7},{7,5},
{7,8},{8,7},{9,10},{10,9},{10,11},{11,10},{11,14},{14,11},
{11,12},{12,11},{12,15},{15,12},{12,13},{13,12},{13,16},{16,13},
{14,17},{17,14},{14,18},{18,14},{15,19},{19,15},{16,20},{20,16},
{17,18},{18,17},{18,23},{23,18},{18,19},{19,18},{19,23},{23,19},
{19,24},{24,19},{19,20},{20,19},{20,21},{21,20},{22,23},{23,22},
{24,25},{25,24}};
源程序代码:
#include"stdafx.h"
#include
#include
#include
#include
#include
#include
#defineMAXQUEUE70//最大顶点个数
structnode
{intvertex;//输入顶点
structnode*nextnode;//指向下一节点
};
typedefstructnode*graph;//图形的结构新形态
structnodehead[61];//图形顶点结构数组
intvisited[61];//遍历记录数组
intqueue[MAXQUEUE];//佇列的最大容量
intfront=-1;//佇列的前端
intrear=-1;//佇列的后端
voidcreategraph(int*node,intnum)
{
graphnewnode;//新顶点指标
graphptr;
intfrom;//边线的起点
intto;//边线的终点
inti;
for(i=0;ivertex=to;//建立顶点内容
newnode->nextnode=NULL;//设定指标初值
ptr=//顶点位置
while(ptr->nextnode!=NULL)//遍历至链表尾ptr=ptr->nextnode;//下一个顶点
ptr->nextnode=newnode;//插入结尾
}
}
intenqueue(intvalue)
{
if(rear>=MAXQUEUE)//检查佇列是否全满
return-1;//无法存入
rear++;//后端指标往前移queue[rear]=value;//存入佇列
return0;
}
intdequeue
{
if(front==rear)//检查佇列是否为空return-1;//无法取出
front++;//前端指标往前移returnqueue[front];//佇列取出
}
/*广度优先*/
voidbfs(intcurrent)
{
graphptr;
enqueue(current);//将顶点存入佇列
visited[current]=1;//记录已遍历过
printf("[%d]",current);//印出遍历顶点值
while(front!=rear)//佇列是否为空
{
current=dequeue;//将顶点从佇列中取出
ptr=head[current].nextnode;//顶点位置
while(ptr!=NULL)//遍历至链表尾{
if(visited[ptr->vertex]==0)//假如没遍历过
{
enqueue(ptr->vertex);//递回遍历呼叫
visited[ptr->vertex]=1;//记录已遍历过
printf("[%d]",ptr->vertex);
}
ptr=ptr->nextnode;//下一个顶点
}
}
}
/*深度优先*/
voiddfs(intcurrent)
{
graphptr;
visited[current]=1;//记录已遍历过
printf("[%d]",current);//印出遍历顶点值
ptr=head[current].nextnode;//顶点位置
while(ptr!=NULL)//遍历至链表尾
{
if(visited[ptr->vertex]==0)//假如没遍历过
dfs(ptr->vertex);//递回遍历呼叫
ptr=ptr->nextnode;//下一个顶点}
}
/*将遍历内容印出.*/
intmain(intargc,char*argv)
{
//clrscr;
system("cls");
while(1)
{
charc,a;
graphptr;
inti;
intnode[60][2]={{1,10},{10,1},{2,10},{10,2},{2,3},{3,2},{3,4},{4,3},
{3,12},{12,3},{4,13},{13,4},{4,5},{5,4},{5,6},{6,5},{5,7},{7,5},
{7,8},{8,7},{9,10},{10,9},{10,11},{11,10},{11,14},{14,11},
{11,12},{12,11},{12,15},{15,12},{12,
13},{13,12},{13,16},{16,13},
{14,17},{17,14},{14,18},{18,14},{15,
19},{19,15},{16,20},{20,16},
{17,18},{18,17},{18,23},{23,18},{18,
19},{19,18},{19,23},{23,19},
{19,24},{24,19},{19,20},{20,19},{20,
21},{21,20},{22,23},{23,22},
{24,25},{25,24}};
system("cls");
printf("\n\n\n");
printf("/*funcotion:TraversingGraphalgorithmdisplay*/\n");
printf("Depth_FirstSearchandBreadth_FirstSearch?Y/N?\n");
c=getchar;
if(c!='y'
system("cls");
printf("\n\n");
printf("pleasenoticethefollowingcities
code:\n\n");
printf("1:乌鲁木齐;2:呼和浩特;3:北京;4:天津;5:沈阳;\n");
printf("6:大连;7:长春;8:哈尔滨;9:西宁;10:兰州;\n");
printf("11:西安;12:郑州;13:徐州;14:成都;15:武汉;\n");
printf("16:上海;17:昆明;18:贵阳;19:株州;20:南昌;\n");
printf("21:福州;22:南宁;23:柳州;24:广州;25:深圳.\n");
getchar;
for(i=1;i",head[i].vertex);
ptr=head[i].nextnode;
while(ptr!=NULL)
{
printf("%d",ptr->vertex);
ptr=ptr->nextnode;
}
}
printf("\n\n");
printf("pleaseyouchooseyouroperation\n");
printf("1、ifBreadth_Searching,pleaseinput:'g'或'G'\n");
printf("2、ifDepth_Searching,pleaseinput:'s'或'S'\n");
c=getchar;
switch(c)
{
case'g':
case'G':
printf("\nplesaeinputthefirstvex:\n");
scanf("%d",
printf("\n\n");
printf("pleasenoticeall
citiescode:\n\n");
printf("1:乌鲁木齐;2:呼和浩
特;3:北京;4:天津;5:沈阳;\n");
printf("6:大连;7:长春;8:哈
尔滨;9:西宁;10:兰州;\n");
printf("11:西安;12:郑州;13:
徐州;14:成都;15:武汉;\n");
printf("16:上海;17:昆明;18:
贵阳;19:株州;20:南昌;\n");
printf("21:福州;22:南宁;23:
柳州;24:广州;25:深圳.\n");
printf("graphBread_Fristsearch
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年国际艺术品交易服务合同
- 2024年卫星遥感数据与应用服务商业化合同
- 2024年国际品牌服装设计与生产合同
- 2024年哈尔滨车辆租赁合同
- 2024年地震勘探与地质灾害防治合同
- 2024年出版合同:某作者出版书籍
- 2024年保险合同:保险权益与责任明确
- 2024年会员卡权益买卖合同
- 2024年企业合并与资产收购合同
- 2024年国内船货运合同
- 家具制造业售后服务预案
- 电子产品维修合同范本1
- 试用期员工转正规章制度(8篇)
- 2023-2024学年全国小学二年级上数学人教版期中考试试卷(含答案解析)
- 《篮球原地双手胸前传接球》教案 (三篇)
- 3上修改病句练习
- 2024年广东茂名高州市教师发展中心和高州市教育事务中心选聘历年高频难、易错点500题模拟试题附带答案详解
- 2024年建筑继续教育-一级建造师继续教育考试近5年真题集锦(频考类试题)带答案
- 上海市浦东新区2023-2024学年六年级上学期期中考试英语试题
- 第7章-机器学习
- 2024年秋季新人教版7年级上册生物课件 第2单元 第2章大单元整体设计
评论
0/150
提交评论