1
《专业实训 II》 实训报告
实训项目名称:
约瑟夫环问题
班级:
学号:
姓名:
指导教师:
2 目录
目录 .................................................................................................................................................. 2 一、摘要........................................................................................................................................... 3 二、专业实训项目描述 ................................................................................................................... 3 三、程序设计 ................................................................................................................................... 3 3.1 菜单系统设计(系统功能结构设计)
............................................................................. 3 3.2 基础数据结构设计 ............................................................................................................ 4 3.3
函数封装(功能模块设计)
.......................................................................................... 4 四、关键算法分析 ........................................................................................................................... 6 五、总结........................................................................................................................................... 6 附录:程序源代码 ........................................................................................................................... 7
湖北第二师范学院计算机学院
83030177
专业实训 I
3
一、摘要
报告描述了《约瑟夫环系统》的 C 语言实现方案,程序代码用 C语言给出,包含所有的数据结构及函数定义、功能模块,以及专业实训过程中的心得体会。
二、专业实训项目描述 本专业实训项目以《约瑟夫环系统》为主题,包含初始化链表、创建链表、约瑟夫环输出等模块,主要采用了循环单链表数据结构,及相关的递归算法等。
三、程序设 计
3.1 菜单系统设计(系统功能结构设计)
void main()
{
int n,m; Node *p,*head; LinkList CL;
printf("\t\t************欢迎来到约瑟夫环*************\n\n\n");
printf("请输入一个初始密码作为一个报数上限值,再输入每个人的密码,并求出出列顺序\n\n\n");
printf("请输入人数 N:\n");
scanf("%d",&n);
printf("请输入初始密码 m:\n");
scanf("%d",&m);
InitCLinkList(&CL);
head=CreateCLinkList(CL,n);
PrintLinkList(head,n);
p=head;
printf("出列的顺序为:\n");
joseph(p,n,m); }
湖北第二师范学院计算机学院
83030177
专业实训 I
4 3.2 基础数据结构设计
************************** typedef struct Node {
int num;
int data;
struct Node *next; } Node,*LinkList;//结点类型,指针类型
int InitCLinkList(LinkList *CL)//创建一个无头结点的单向循环链表 {
int key;
printf("请依次输入密码:");
scanf("%d",&key);
*CL=(Node *)malloc(sizeof(Node));//申请一个结点
(*CL)->data=key;
(*CL)->num=1;
(*CL)->next=*CL;
return OK; }
3.3
函数封装(功能模块设计)
1.主函数模块——执行输入调用其他的功能函数 2.创建环表模块——创建单向循环链表 Node *CreateCLinkList(LinkList CL,int n) {
Node *rear; Node *s,*head;
int i=1,key;
rear=CL;
for(i=2;i<=n;i++)
{
scanf("%d",&key);
head=s=(Node*)malloc(sizeof(Node));//创建一个结点
s->data=key;
s->num=i;
rear->next=s;
湖北第二师范学院计算机学院
83030177
专业实训 I
5
rear=s;
}
head=rear->next=CL;//尾指针指向头指针
return head;
} 3.计算处理模块——计算出要出列的标号并输出 4.宣示模块——输出建立好的环表
int PrintLinkList(LinkList CL,int n)
{
int i;
Node *p;
p=CL;
printf("每个人的序号及对应的密码为:\n");
for(i=1;i<=n;i++)
{
printf("%d,%d\n",p->num,p->data);
p=p->next;
}
if(p=NULL)
{
printf("此链表为空");
exit(OVERFLOW);
}
printf("\n");
return OK;
}
湖北第二师范学院计算机学院
83030177
专业实训 I
6
四、关键算法分析 int joseph(LinkList CL,int n,int m)
{
int i,j;
Node *p;
Node *q;
p=CL;
for(j=1;j<m-1;j++)//循环到第 m-1 个结点
{
p=p->next;
}
q=p->next;
//q 指向第 m 个结点
p->next=q->next;
p=p->next;
printf("%d\t",q->num);//输出第 m 个结点的序号
n--;
if(n>1)
joseph(p,n,q->data);//用第 m 个结点的密码进行递归调用
else
printf("%d",p->num);//输出最后一个结点的序号
free(q);
p->next=NULL;
return OK;
} 五、 总结 答:细节决定成败,编程最需要的是严谨,如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上。在写主要函数 joseph()时,在查找目标结
湖北第二师范学院计算机学院
83030177
专业实训 I
7 点的书写处不是很清楚,导致我浪费了很多时间。
附录:程序源代码 #include <stdio.h> #include <stdlib.h> #include <conio.h> #define OK 1 #define OVERFLOW 0 typedef struct Node {
int num;
int data;
struct Node *next;
} Node,*LinkList;
int InitCLinkList(LinkList *CL) {
int key;
printf("请依次输入密码:");
scanf("%d",&key);
*CL=(Node *)malloc(sizeof(Node));
(*CL)->data=key;
(*CL)->num=1;
(*CL)->next=*CL;
return OK; }
Node *CreateCLinkList(LinkList CL,int n) {
Node *rear; Node *s,*head;
int i=1,key;
rear=CL;
for(i=2;i<=n;i++)
{
scanf("%d",&key);
head=s=(Node*)malloc(sizeof(Node));
s->data=key;
s->num=i;
rear->next=s;
湖北第二师范学院计算机学院
83030177
专业实训 I
8
rear=s;
}
head=rear->next=CL;
return head;
}
int joseph(LinkList CL,int n,int m)
{
int i,j;
Node *p;
Node *q;
p=CL;
for(j=1;j<m-1;j++)
{
p=p->next;
}
q=p->next;
p->next=q->next;
p=p->next;
printf("%d\t",q->num);
n--;
if(n>1)
joseph(p,n,q->data);
else
printf("%d",p->num);
free(q);
p->next=NULL;
return OK;
}
int PrintLinkList(LinkList CL,int n)
{
int i;
Node *p;
p=CL;
printf("每个人的序号及对应的密码为:\n");
for(i=1;i<=n;i++)
{
printf("%d,%d\n",p->num,p->data);
p=p->next;
湖北第二师范学院计算机学院
83030177
专业实训 I
9
}
if(p=NULL)
{
printf("此链表为空");
exit(OVERFLOW);
}
printf("\n");
return OK;
}
void main()
{
int n,m; Node *p,*head; LinkList CL;
printf("\t\t************欢迎来到约瑟夫环*************\n\n\n");
printf("请输入一个初始密码作为一个报数上限值,再输入每个人的密码,并求出出列顺序\n\n\n");
printf("请输入人数 N:\n");
scanf("%d",&n);
printf("请输入初始密码 m:\n");
scanf("%d",&m);
InitCLinkList(&CL);
head=CreateCLinkList(CL,n);
PrintLinkList(head,n);
p=head;
printf("出列的顺序为:\n");
joseph(p,n,m); }
推荐访问: 约瑟夫 实验 报告上一篇:扩频通信实验报告
下一篇:java课程设计实验报告
同志们:今天这个大会,是市委全面落实党要管党、从严治党要求的一项重大举措,也是对县市区委书记履行基层党建工作第一责任人情况的一次集中检阅,同时是对全市基层党建工作的一次再部署、再落实的会议。前面,**
***年,我认真履行领班子、带队伍、抓党员、保稳定的基层党建工作思路,以学习贯彻习近平新时代中国特色社会主义思想和党的十九大历次全会精神为主线,以市局基层党建工作考核细则为落脚点,落实全面从严治党主体
根据会议安排,现将2022年履行抓基层党建工作职责情况报告如下:一、履职工作特色和亮点1 突出政治建设,着力在思想认识上提高。牢固树立抓党建就是抓政绩的理念,以“党建工作抓引领、社区治理求突破,为民服
2022年以来,在**党委的正确领导下,坚持以习近平新时代中国特色社会主义思想为指导,深入学习宣传贯彻党的二十大精神,以党建工作为统领,扎实开展夯实“三个基本”活动,以“四化四力”行动为抓手,聚力创建
各位领导,同志们:根据会议安排,现就2022年度抓基层党建工作情况汇报如下:一、主要做法及成效(一)强化政治引领。一是不断强化理论武装。坚持通过党组会、中心组学习会和“三会一课”,第一时间、第一议题学
2022年度抓基层党建工作述职报告按照党委工作部署,现将本人2022年度抓基层党建工作情况报告如下:一、2022年度抓基层党建工作情况(一)旗帜鲜明讲政治将旗帜鲜明讲政治放在全局发展首要位置,积极开展
2022年,是我在数计系党总支书记这个新岗位上度过的第一个完整的工作年度。回首一年来在校党委的正确领导下,与数计系领导班子和全体师生共同走过的日子,艰辛历历在目,收获温润心田。作为党总支书记,我始终牢
按照考核要求,现将本人一年来,作为统战部长履行职责、廉洁自律等方面情况报告如下:一、着眼增强政治素质,不断深化理论学习坚持把旗帜鲜明讲政治作为履职从政的第一位要求,带领统战系统干部坚决拥护“两个确立”
**年,紧紧围绕党工委、管委会的决策部署,全体人员团结协作、凝心聚力,紧扣党工委“**”基本工作思路,全力开拓进取,认真履职尽责,圆满完成各项工作任务。一、个人思想政治状况柠檬文苑www bgzjy
按照县委关于开展抓基层党建述职评议会议的有关要求,经请示县委组织部同意,今天,我们在此召开2022年度基层党组织书记抓基层党建述职评议会议。1 首先,请**党委书记,**同志述职。**党委能够主动研究