课程设计(约瑟夫环)[1]

合集下载

数据结构课程设计 约瑟夫环问题(报告+代码)

数据结构课程设计      约瑟夫环问题(报告+代码)

学院计算机与信息工程系数据结构课程设计设计题目:约瑟夫环问题专业班级学号姓名指导教师2010年12月20日约瑟夫环一.实验目的:本实验是设计一个可以解决约瑟夫环问题的程序。

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

二.实验环境:VC2008.三.试验步骤:1.问题分析和任务定义本实验要求设计一个程序解决约瑟夫环问题,且要利用单向循环链表存储结构模拟此过程。

这就要求我们必须用链表结构而不能用像数组等其它结构。

首先输入的数据必须是整型且是整数,同样输出的也必须是整型且整数;其次也要备好测试数据(包括合法的输入数据和非法形式输入的数据)以此来检查程序是否符合要求;最后2.数据类型和系统设计链表存储结构的定义:typedef struct Node{}SeqList链表的建立:SeqList * Creat(int num){}链表的输出:void OutQueue(SeqList * tail, int num, int code){}3.详细设计:#include <stdio.h>#include <stdlib.h>typedef struct Node{int num;int code;struct Node * next;}SeqList;SeqList * Creat(int);void OutQueue(SeqList *, int , int );int main(){int n,m,i;printf( " 姓名:徐正杰学号:090502201:\n");printf("Input The Number of People, Frist Code:");{int num = 0,code = 0;scanf("%d%d",&num, &code);{SeqList * tail = NULL;tail=Creat(num);OutQueue(tail, num, code);}}return 0;}SeqList * Creat(int num){getchar();SeqList * tail = NULL;tail=(SeqList *)malloc(sizeof(SeqList));{int i = 1, code = 0;printf("Input Num.%d Code:", i);scanf("%d", &code);tail->num = i;tail->code = code;tail->next = tail;{SeqList * p = NULL;for(i = 2; i <= num; ++i){p = (SeqList *)malloc(sizeof(SeqList));if(p){printf("Input Num.%d Code:", i);scanf("%d", &code);p->num = i;p->code = code;p->next = tail->next;tail->next = p;tail = p;}else{perror("Out of menroy!");getchar();exit(1);}}}}return(tail);}void OutQueue(SeqList * tail, int num, int code) {printf("Out of Queue:");{SeqList * p;while(tail - tail->next){code=(code-1)%num+1;{int i;for(i = 1; i < code; ++i){tail = tail->next;}}p = tail->next;printf("%d,", p->num);tail->next = p->next;code = p->code;free(p);p = NULL;--num;}}printf("%d.",tail->num);free(tail);tail = NULL;}4.调试分析在本次试验调试中很不顺利。

大学数据结构课程设计-实习报告——约瑟夫环

大学数据结构课程设计-实习报告——约瑟夫环

20XX年复习资料大学复习资料专业:班级:科目老师:日期:数据结构实习报告题目:程序求解约瑟夫环问题出列顺序一、需求分析1.以单项循环链表存储结构模拟约瑟夫环问题。

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

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

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

按出列顺序印出各人的编号。

2.演示程序以用户与计算机的对话方式执行,用户输入相应的数据,输出结果显示在其后。

3.测试数据:(1)n=77个人的密码依次为:3,1,7,2,4,8,4;首先m值为6(正确的输出顺序为:6,1,4,7,2,3,5)(2)n=55个人的密码依次为:1,2,3,4,5首先m值为1(正确的输出顺序为:1,2,4,3,5)(3)n=5首先m值为-2(输入的人数和初始密码不能为负数!)二、概要设计为实现上述程序功能,应利用单向循环链表存储结构模拟此过程。

1.单向循环链表的抽象数据类型定义为:ADT CircularList{数据对象:D={ai|ai∈LNode,i=1,2,…,n,n≥0}数据关系:R1={<ai-1,ai>|ai-1∈D,i=2,…,n}基本操作:Status ListDelete_L(LinkList &L,int I,ElemType &e)操作结果:在带头结点的单链表L中,删除第i个元素,并用e返回其值}2.本程序中包括的三个基本模块:1)主程序模块:Void main(){初始化;do{接受命令;处理命令;}while(“命令”=”退出”)}2)线性表模块:实现线性表的抽象数据结构3)元素结构单元模块:定义线性表中每个元素的结构三、详细设计1.结点类型typedef struct LNode{int data;//密码int i;//编号struct LNode *next;}LNode, *LinkList;2.用循环链表存储约瑟夫环,没有头结点,基本操作函数如下:int CreateList(LinkList &L,int a[],int n){//创建循环链表结构的约瑟夫环LinkList s,r;int i;r=L;for(i=1;i<=n;i++){s=(LinkList )malloc(sizeof(LNode));s->data=a[i];s->i=i;if(i==1){L=s;s->next=s;r=s;//尾指针指向当前元素}else{s->next=r->next;r->next=s;r=s;}}return 1;}int ListDelete_L(LNode *L){//删除表中一个结点if(L->next==L)//只剩一个结点{printf("%d\n",L->i);free(L);return 0;}LNode *p;p=L->next;//p指向要删除元素的下一个结点while(p->next!=L)p=p->next;LNode *q=L;//q指向需要被删除的元素结点int e=L->i;p->next=L->next;free(q);printf("%d ",e);return 1;}int FindNode(LinkList L,int x){//查找表中某个结点LinkList p=L;LinkList q;for(int i=1;i<x;i++)p=p->next;q=p->next;//下一次循环的起始位置x=p->data;if(ListDelete_L(p))FindNode(q,x);return p->i;}3.主函数:int main(){int n,m;LinkList L;printf("请输入人数和初始密码:");scanf("%d %d",&n,&m);if(n<0||m<0){printf("输入的人数和初始密码不能为负数!\n");return 0;}int a[20XXXX0];printf("请输入每个人的密码:");for(int i=1;i<=n;i++)scanf("%d",&a[i]);if(CreateList(L,a,n)){printf("\n");printf("正确的出列顺序为:");FindNode(L,m);printf("\n");}return 0;}4.函数的调用关系图反映了演示程序的层次结构:CreateList FindNodeListDelete_L四、调试分析1.刚开始时,忽略了题目要求的没有头结点这一项,没有把第一个结点单独拿出来建立,出现了逻辑上的错误。

约瑟夫环课程设计实验报告

约瑟夫环课程设计实验报告

约瑟夫环课程设计实验报告《数据结构》课程设计报告课程名称:《数据结构》课程设计课程设计题目:joseph环姓名:院系:计算机学院专业:年级:学号:指导教师:2011年12月18日目录1 课程设计的目的 (2)2 需求分析 (2)3 课程设计报告内容 (3)1、概要设计 (3)2、详细设计 (3)3、调试分析 (x)4、用户手册 (x)5、测试结果 (6)6、程序清单 (7)4 小结 (10)1、课程设计的目的(1)熟练使用C++编写程序,解决实际问题;(2)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;(3)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;2、需求分析1、问题描述:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。

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

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

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

2、要求:利用不带表头结点的单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。

3、测试数据:m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4,首先m=6,则正确的输出是什么?输出形式:建立一个输出函数,将正确的输出序列3、课程设计报告内容概要设计:在理解了题目后,我先想到的是我们所学的单链表,利用单链表先建立循环链表进行存贮,建立完循环链表后,我将所要编写的函数分为了两块,一块是经过学过的单链表改编的循环链表的基本操作函数,还有一块是运行约瑟夫环的函数。

详细设计:我先建立一个结构体,与单链表一样,只是多了一个存密码的code域struct LinkNode{int data; /删除的是尾结点时(不知道为什么我写程序里总是编译出现错误){q->next=head; //重新链接delete a;len--;return out;}else{q->next=a->next; delete a;len--;return out;}}}}5、测试结果:6 程序清单:#include <>struct LinkNode{int data;int code;LinkNode *next;};class LinkList{public:LinkList();void Creat(const int ); //~LinkList();int Delete(LinkNode* );int Joseph(int );private:LinkNode* head;LinkNode* elem;int len;};LinkList::LinkList(){head=elem=NULL;len=0;}void LinkList::Creat(const int number) {if(number==1){head=elem=new LinkNode;head->data=1;cout<<"请输入密码:"<<endl;< bdsfid="152" p=""></endl;<> cin>>head->code;head->next=head;}else{head=elem=new LinkNode;head->data=1;cout<<"请依次输入各个密码:"<<endl;< bdsfid="161" p=""></endl;<>cin>>head->code;LinkNode*q=head;q=head;for(int i=1;i<number;i++)< bdsfid="166"p=""></number;i++)<>{LinkNode*p=new LinkNode;p->data=i+1;cin>>p->code;q->next=p;q=p;}q->next=head;}len=number;}int LinkList::Delete(LinkNode *a){if(len>1){if(head==a){int out=head->data;LinkNode* q=head;while(q->next!=head){q=q->next;}q->next=head->next;head=head->next;delete a;len--;return out;}else{LinkNode* q=head;int out=a->data;while(q->next!=a){q=q->next;}q->next=a->next;delete a;len--;return out;}}}int LinkList::Joseph(int m){if(len>1){LinkNode *q;if(m==1){q=elem;int a=q->code;elem=elem->next;cout<<delete(q)<<endl;< bdsfid="222" p=""></delete(q)<<endl;<>Joseph(a);}else{for(int i=1;i<m;i++)< bdsfid="228" p=""></m;i++)<>elem=elem->next;q=elem;elem=elem->next;int a=q->code;cout<<delete(q)<<endl;< bdsfid="234" p=""></delete(q)<<endl;<>Joseph(a);}}elsecout<data;}int main(){int num,code;cout<<"请输入人数: ";cin>>num;LinkList L;(num);cout<<"请输入第一个上限数: ";cin>>code;cout<<"出列顺序:"<<endl;< bdsfid="252" p=""></endl;<> (code);return 0;}4、小结一、这次课程设计的心得体会通过实践我的收获如下:一开始接触数据结构课程设计真的挺难的,好多都不会,不是逻辑方面的问题,而是不具备动手能力,脑子里总有一团火,比如对于这个题目,一开始有很多的想法,想到了从逻辑上怎么实现他,要编写哪些程序,但是一到需要编写了就开始为难了,可以说是几乎不知道从哪里入手,参考了书本里的程序,仿照他的结构一步一步做下来,现在对于单链表的各种操作已经算是比较熟练了,让我知道光有理论知识还远远不够,需要多动手,写的多了自然就能手到擒来。

c课程设计约瑟夫环

c课程设计约瑟夫环

c 课程设计约瑟夫环一、教学目标本课程的目标是让学生理解和掌握约瑟夫环的原理及其在计算机科学中的应用。

知识目标包括:了解约瑟夫环的概念、算法实现和数学原理;技能目标涵盖:能够使用至少一种编程语言实现约瑟夫环算法,并进行简单的性能分析;情感态度价值观目标强调:培养学生的逻辑思维能力,激发他们对计算机科学和算法研究的兴趣。

二、教学内容教学内容围绕约瑟夫环的理论基础和实际应用展开。

首先介绍约瑟夫环的基本概念,然后通过编程实践让学生深入理解算法的工作原理。

具体包括:1.约瑟夫环的定义及其在计算机科学中的应用。

2.约瑟夫环算法的不同变体及其实现方法。

3.循环队列的概念及其在约瑟夫环算法中的作用。

4.通过编程练习,掌握至少两种不同的编程语言实现约瑟夫环算法。

三、教学方法为了提高学生的理解能力和实践技能,将采用多种教学方法相结合的方式:1.讲授法:用于解释约瑟夫环的基本概念和数学原理。

2.案例分析法:通过分析具体的约瑟夫环应用实例,加深学生对知识点的理解。

3.实验法:安排实验室实践环节,让学生亲自编写代码实现算法。

4.分组讨论法:鼓励学生在小组内交流想法,共同解决问题,培养团队协作能力。

四、教学资源为了支持课程的顺利进行,将准备以下教学资源:1.教材:《计算机科学基础》相关章节。

2.参考书籍:提供关于算法和数据结构的进阶阅读材料。

3.多媒体资料:制作PPT和视频教程,辅助学生理解复杂概念。

4.编程环境:为学生提供合适的编程环境和在线编程平台。

5.实验设备:确保实验室中每名学生都有足够的机器进行编程实践。

五、教学评估教学评估是衡量学生学习成果的重要手段。

本课程的评估方式包括:平时表现(30%)、作业(20%)、小测验(20%)、实验报告(20%)和期末考试(10%)。

平时表现评估将基于学生的课堂参与、提问和小组讨论;作业将主要是编程练习,旨在巩固课堂所学;小测验将定期进行,以检查学生的理解程度;实验报告将评价学生对实验操作的理解和分析能力;期末考试将涵盖所有课程内容,测试学生的综合理解能力。

数据结构课程设计-joseph环

数据结构课程设计-joseph环
单向循环链表是一种链式存储结构,它的特点是表中最后一个结点的指针域指向头结 点,整个链表形成一个环,由此,从表中任意结点出发均可找到表中其他结点。单向循环链 表的构造类似于单向链表的构造,但是不同的是最后一个元素的指针指向的是首元素。 循环链表的操作和线性链表基本一致,差别仅在于算法中的循环条件不是 p 或 p->next
沈 阳 大 学
课程设计说明书
return(d); }
NO.11
LINK CreateLinklist ( DATA *d, int n) { NODE *l,*p,*s ; int i; p=l=( NODE * ) malloc ( sizeof (NODE) ); p->num=d->num; p->m=d->m; d++; for(i=1;i<n;i++) { s=(NODE *)malloc(sizeof(NODE)); s->num=d->num; s->m=d->m; p->next=s; p=s; d++; } s->next=l; return(l); }
沈 阳 大 学
课程设计说明书
Joseph 环构造函数 void Joseph ( LINK l,int n,int m )
NO.8
// l 为单链表首节点地址,m 是初始报数上限
{LINK p,q,s; int i,j;
p=l; printf("\n"); for(i=0;i<n;i++) { for(j=1;j<m;j++) { q=p; p=p->next; } printf("%d\t",p->num); m=p->m; q->next=p->next; p=p->next; } } 约瑟夫构造函数的流程图如下: //删除已经输出编号的节点 //从相邻的下一个节点开始下一次循环 //输出第 m 个节点的编号 // p 指向第 m 个节点 //n 次循环输出 n 个节点的编号 // 每次循环要经过 m-1 个节点

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

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

约瑟夫环说明:1、学院、专业、年级均填全称,如:光电工程学院、测控技术、2003。

2、本表除签名外均可采用计算机打印。

本表不够,可另附页,但应在页脚添加页码。

约瑟夫环【问题描述】约瑟夫(Joeph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。

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

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

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

【基本要求】利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号【算法思想】游戏实现的关键是游戏信息的储存。

包括玩家座位信息,玩家所报数信息以及密码信息。

我们通过自定义单向循环链表Joeph_list存储结构来实现游戏过程的模拟。

链表以结点连接。

结点Node存储的信息包括每个人手中的密码、每个人的位置以及下一个结点在计算机中的存储位置,及指向下一个结点的指针。

值得注意的是,信息“每个人的位置”是必不可少的,因为他不等同于结点在链表中的位置——但一个玩家被移除之后,链表后的元素位置会“前进”,而我们需要的玩家的位置始终是不变的。

玩家的报数,我们通过循环中计数器的递增实现,当顺序递增到链表中最后一个结点,而循环仍没有结束时,我们继续从第一个元素开始递增——及相当于最后一个玩家仍没有报数到m我们就从第一个玩家重头开始报数。

直到计数器累加到m,则发现我们要移除的结点,记录并输出移出结点的信息,继续游戏。

直到链表中元素被清空,程序结束。

算法的关键是将实际游戏场景抽象到链表中的元素的查找和移除上,要掌握清楚哪些数据代表哪些信息,并熟悉程序运行中各种判断的流程。

具体流程图见下一页。

【模块划分】【数据结构】Member *Joseph::Index(int i) {if(i==0)return frist;Member *p=frist->next;int j=1;while(j<i){p=p->next;j++; }return p;}int Joseph::Delete(int i){Member *s,*p=Index(i-1);s=p->next;p->next=p->next->next;int x=s->number;cout<<x<<" ";int y=s->password;delete s;size--;return y;}【源程序清单】ysfh.cpp【测试数据】输入给定数字:N = 7,测定数据为3,1,7,2,4,8,4,m = 20 【测试情况】1.输入玩儿游戏的总人数m:2.输入作为队首的人的初值m:3.依次输入每个人的密码:4.出列的结果为:。

数据结构约瑟夫环问题的课程设计

数据结构约瑟夫环问题的课程设计

课程设计与内容要求约瑟夫环问题[问题描述]编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人持有一个密码(正整数)。

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

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

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

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

此题所用的循环链表中不需要“头结点”,请注意空表和非空表的界限。

[测试数据]m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4,首先m=则正确的输出是什么?[要求]:输入数据:首先输入待处理人员数及他们的密码,然后输入m的初值,建立单循环链表。

输出形式:建立一个输出函数,将正确的出列序列输出。

一问题描述与分析约瑟夫问题编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人持有一个密码(正整数)。

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

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

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

分析利用单循环链表解决本问题,先创建一个有n个的单循环链表,依次录入密码。

然后从第一个结点出发,连续略过 m-1个结点,将第m个结点从链表中删除,并将第m个结点的密码作为新的么值,接着从下个结点开始,循环此过程,直至链表为空。

二数据结构描述利用不带头结点的单循环链表来作为约瑟夫环的存储结构三主要算法流程描述1主要流程图2具体程序段及其说明#include<stdio.h>#include<malloc.h>typedef struct node{int number;int key;struct node* next;}listnode, * circularlist;//定义了结点类型listnode和指针类型circularlistint main(){int amount,t,code,m,k;// amount表示总人数,code表示相应的学生密码circularlist w=(listnode*)malloc(sizeof(listnode));w->next=w;//循环链表仅一个元素时依然满足listnode *v;printf("请输入总人数:");scanf("%d",&amount);v=w;for(k=1;k<=amount;k++){printf("请输入第%d 学生的密码: ",k);scanf("%d",&code);w->key=code;w->number=k;if(k!=amount){w->next=(listnode*)malloc(sizeof(listnode));w=w->next;}w->next=v;}//循环结束后自动生成链表头printf(“约瑟夫环已建成,可以开始!\n”);printf("请输入初值: ");scanf("%d",&m);if(m<=0){printf("输入错误,请重新输入\n");return(1);}m=m-1;//使w提前停下printf("出列顺序是:");//用w为起始点do{t=0;//加入m减1后为零的情况while(t!=m){w=w->next;t++;}v=w->next;w->next=v->next;printf(" %d",v->number);m=v->key;m=m-1;free(v);//释放v的存储空间}while(w->next!=w);printf(" %d\n",w->number);free(w); //释放w的存储空间getchar();getchar();return(0);}四使用说明1进入C工作环境:如Turbo C2.0, Turbo C++ 3.0,Microsoft visual C++ 6.0(本次课程设计使用环境)2输入自己所编好的程序,通过键盘或软键盘。

约瑟夫环课程设计报告

约瑟夫环课程设计报告

课程设计报告课程设计名称:数据结构课程设计课程设计题目:约瑟夫环院(系):专业:班级:学号:姓名:指导教师:目录1 课程设计介绍 (1)1.1课程设计内容 (1)1.2课程设计要求 (1)2 课程设计原理 (2)2.1课设题目粗略分析 (2)2.2原理图介绍 (2)2.2.1 功能模块图(如图2.1) (2)2.2.2 流程图分析 (3)3 数据结构分析 (5)3.1存储结构 (5)3.2算法描述 (5)4 调试与分析 (6)4.1调试过程 (6)4.2程序执行过程 (6)参考文献 (8)附录(关键部分程序清单) (9)1 课程设计介绍1.1 课程设计内容编号为1,2,……,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。

一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列顺序。

使用单循环链表作为存储结构分析:由题意可以将每个人看做链表上的一个节点,每个人持有的密码即为每个节点所存储的数据;相邻的人之间存在连结关系,即链表的两个相邻节点之间由指针来进行关联;最后一个人和第一个人也存在连结关系,即链表的末尾节点和头结点相连构成了单循环链表存储结构。

执行报数过程可以看做一个单独指针依次指向每一个节点,有人出列即删除掉链表中相应的节点。

1.2 课程设计要求1.参考相应的资料,独立完成课程设计任务。

2.交规范课程设计报告和软件代码。

2课程设计原理2.1 课设题目粗略分析根据课设题目要求,程序应该分为两大部分:1、单循环链表储存结构的建立:建立所需的单循环链表数据存储结构,对每个节点输入所需的密码、序号数据并通过指针连接成单循环链表。

2、实现约瑟夫环数据出列顺序的算法:依照题目要求按照报数上限对节点进行查找和删除操作,按顺序输出出列的节点序号,依照每次出列的节点存储的密码修改报数上限循环操作直到全部节点出列完毕程序运行结束。

数据结构课程设计报告约瑟夫环完整版[1]

数据结构课程设计报告约瑟夫环完整版[1]

... . .*******************实践教学*******************理工大学软件职业技术学院2011年春季学期算法与数据结构课程设计题目:约瑟夫环专业班级:姓名:学号:指导教师:成绩:摘要约瑟夫环问题是典型的线性表的应用实例,其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。

对于前者要求建立起数据一致性和完整性强、数据安全性好的库。

而对于后者则要求应用程序功能完备,易使用等特点。

经过分析,我们使用MICROSOFT公司的Microsoft Visual C++6.0开发工具,利用其提供的各种面向对象的开发工具,尤其是数据窗口这一能方便而简洁操纵数据库的智能化对象,首先在短时间建立系统应用原型,然后,对初始原型系统进行需求迭代,不断修正和改进,直到形成用户满意的可行系统。

关键词:单循环链表;c语言;约瑟夫环;序言数据结构是研究数据元素之间的逻辑关系的一门课程,以及数据元素及其关系在计算机中的存储表示和对这些数据所施加的运算。

该课程设计的目的是通过课程设计的综合训练,培养分析和编程等实际动手能力,系统掌握数据结构这门课程的主要容。

本次课程设计的容是用单循环链表模拟约瑟夫环问题,循环链表是一种首尾相接链表,其特点是无须增加存储容量,仅对表的方式稍作改变,使表处理更加灵活,约瑟夫环问题就是用单循环链表处理的一个实际应用。

通过这个设计实例,了解单链表和单循环链表的相同与不同之处,进一步加深对链表结构类型及链表操作的理解。

通过该课程设计,能运用所学知识,能上机解决一些实际问题,了解并初步掌握设计、实现较大程序的完整过程,包括系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。

目录摘要 (1)序言 (2)目录 (3)正文 (4)一、问题描述 (4)二、逻辑设计 (5)三、详细设计 (7)四、程序代码 (13)五、程序调试与测试 (13)设计总结 (18)参考文献 (19)致 (20)附录 (21)正文一、问题描述约瑟夫环问题描述的是:设编号为1,2,…,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一正整数密码。

c课程设计约瑟夫问题

c课程设计约瑟夫问题

c课程设计约瑟夫问题一、教学目标本章节的教学目标分为三个维度:知识目标、技能目标和情感态度价值观目标。

1.知识目标:通过学习约瑟夫问题,学生能够理解并掌握约瑟夫问题的基本概念、原理和解决方法。

2.技能目标:学生能够运用所学的约瑟夫问题的解决方法,解决实际问题,并能够进行简单的数学推理和分析。

3.情感态度价值观目标:通过学习约瑟夫问题,学生能够培养对数学的兴趣和好奇心,提高解决问题的能力和团队合作的精神。

二、教学内容本章节的教学内容以约瑟夫问题为核心,包括以下几个方面:1.约瑟夫问题的定义和背景介绍。

2.约瑟夫问题的解决方法,包括递归法、循环队列法和迭代法。

3.约瑟夫问题的应用场景,结合实际问题进行讲解。

4.约瑟夫问题的扩展,如约瑟夫环的生成和约瑟夫问题的变种。

三、教学方法为了激发学生的学习兴趣和主动性,本章节将采用多种教学方法:1.讲授法:通过讲解约瑟夫问题的定义、原理和解决方法,使学生掌握基本概念和知识点。

2.案例分析法:通过分析实际问题,引导学生运用所学的约瑟夫问题的解决方法,培养学生的解决问题的能力。

3.实验法:通过进行约瑟夫问题的编程实验,让学生亲手实践,加深对解决方法的理解和记忆。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,将选择和准备以下教学资源:1.教材:选用权威、系统的教材,如《计算机科学导论》等,作为学生学习的基本依据。

2.参考书:推荐一些相关的参考书,如《算法导论》等,供学生进一步拓展学习。

3.多媒体资料:制作PPT、教学视频等多媒体资料,以图文并茂的形式呈现教学内容,提高学生的学习兴趣。

4.实验设备:准备计算机实验室,让学生能够进行约瑟夫问题的编程实验,提高实践能力。

五、教学评估本章节的评估方式包括平时表现、作业和考试三个部分,以全面、客观、公正地评估学生的学习成果。

1.平时表现:通过观察学生在课堂上的参与度、提问和回答问题的表现,了解学生的学习态度和理解程度。

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

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

课程设计报告一、需求分析1、本演示程序中,利用单向循环链表存储结构模拟约瑟夫问题的进行。

程序运行后,首先要求用户指定初始报数上限值,然后读取个人的密码。

可设n≤30。

此题所用的循环链表中不需要“头结点”,因此在程序设计中应注意空表和非空表的界限。

2、演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令:相应的输入数据和运算结果显示在其后。

3、程序执行的命令包括:1)构造约瑟夫环;2)执行约瑟夫环,并输出出列人的序号以及相应的密码;3)结束。

4、测试数据1)m的初始值为20;2)n=7,7个人的密码依次为:3、1、7、2、4、8、4。

3)首先m值为6,正确的出列顺序应为6、1、4、7、2、3、5。

二、概要设计为实现上述程序功能,应以单向循环链表表示约瑟夫环。

为此,需要两个抽象数据类型:单向循环链表和约瑟夫环。

1)、单向循环链表的抽象数据类型定义为:ADT List{数据对象:D={ai|ai∈Elemset,i=1,2,…,n,n≥0}数据关系:R1={<a(i-1),ai>|a(i-1),ai∈D,i=2,…n}基本操作:InitList(&L)操作结果:构造一个空的链表L。

DestroyList(&L)初始条件:线性表L已存在。

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

ListLength(L)初始条件:线性表L已存在。

操作结果:返回L中数据元素个数。

GetElem(L,i,&e)初始条件:线性表L已存在,1≤i≤ListLength(L)。

操作结果:用e返回L中第i个数据元素的值。

ListInsert(&L,I,e)初始条件:线性表L已存在,1≤i≤ListLength(L)+1。

操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1。

ListDelete(&L,i,&e)初始条件:线性表L已存在且非空,1≤i≤ListLength(L)。

数据结构joseph课程设计

数据结构joseph课程设计

数据结构joseph课程设计一、课程目标知识目标:1. 学生能理解约瑟夫问题(Josephus problem)的背景和数学原理,掌握其与数据结构中循环链表的关系。

2. 学生能够掌握循环链表的基本操作,包括节点的插入、删除以及遍历。

3. 学生能够运用所学的循环链表知识解决约瑟夫问题,并理解其算法的效率。

技能目标:1. 学生能够运用编程语言(如C/C++/Java等)实现循环链表,并完成相应的约瑟夫问题求解程序。

2. 学生通过实际操作循环链表,提高逻辑思维能力和编程实践能力。

3. 学生能够通过分析、讨论和解决问题,培养团队协作能力和问题解决能力。

情感态度价值观目标:1. 学生通过解决实际问题,增强对数据结构学习的兴趣和热情,形成积极向上的学习态度。

2. 学生在团队协作中学会尊重他人,培养良好的沟通能力和合作精神。

3. 学生通过探究和解决约瑟夫问题,体会数学和计算机科学的实际应用价值,增强对科学的敬畏之心。

课程性质:本课程设计属于数据结构学科范畴,以实践操作和问题解决为核心,强调理论与实践相结合。

学生特点:考虑到学生已具备一定的编程基础和逻辑思维能力,课程设计将注重培养学生的实践能力、团队协作能力以及创新意识。

教学要求:教师应关注学生的个体差异,因材施教,引导学生通过自主探究、合作学习等方式达到课程目标。

在教学过程中,注重过程评价和结果评价相结合,全面评估学生的学习成果。

二、教学内容本节教学内容围绕数据结构中的循环链表及其应用——约瑟夫问题展开,具体安排如下:1. 循环链表基础知识回顾:- 循环链表的定义与特点- 循环链表的节点结构- 循环链表与普通链表的区别2. 循环链表的操作:- 节点的插入与删除- 循环链表的遍历- 循环链表的应用场景3. 约瑟夫问题介绍:- 约瑟夫问题的背景和数学原理- 约瑟夫问题与循环链表的关系4. 约瑟夫问题求解:- 算法设计思路- 编程实现步骤- 算法效率分析5. 实践环节:- 编写循环链表的基本操作函数- 编写求解约瑟夫问题的程序- 调试与优化程序6. 教学案例分析:- 结合实际案例,讲解循环链表在解决约瑟夫问题中的应用- 分析案例中的算法优化方法教学内容根据课本相应章节进行组织,确保学生能够在掌握循环链表基础知识的基础上,学会解决实际问题。

C语言约瑟夫环课程设计

C语言约瑟夫环课程设计

C语言约瑟夫环课程设计一、教学目标本节课的教学目标是使学生掌握约瑟夫环的原理及其在C语言中的实现。

知识目标包括:理解约瑟夫环的概念、熟悉C语言的基本数据结构和算法。

技能目标则要求学生能够运用C语言实现约瑟夫环问题,并具备一定的调试能力。

情感态度价值观目标则是培养学生的逻辑思维能力,提高他们解决实际问题的兴趣和信心。

二、教学内容本节课的教学内容主要包括两个部分:首先是约瑟夫环的理论基础,包括其概念、原理和应用;其次是C语言的编程实践,包括算法设计、代码编写和调试。

教材选用《C程序设计》一书,具体涉及第7章“循环结构”的内容。

三、教学方法为了达到本节课的教学目标,将采用多种教学方法相结合的方式。

首先是讲授法,用于讲解约瑟夫环的理论基础;其次是讨论法,鼓励学生针对实际问题进行思考和交流;再次是案例分析法,通过分析具体案例,使学生掌握算法设计和代码编写技巧;最后是实验法,让学生在实际操作中提高编程能力。

四、教学资源为了支持教学内容和教学方法的实施,将准备以下教学资源:教材《C程序设计》、参考书《C语言程序设计教程》、多媒体教学课件、在线编程平台和调试工具。

此外,还将利用网络资源,如教学视频、博客和论坛,为学生提供更多的学习资料和实践机会。

五、教学评估本节课的评估方式将采用多元化评价体系,全面反映学生的学习成果。

评估方式包括:平时表现、作业、考试和课堂讨论。

平时表现主要考察学生的出勤、纪律和参与度;作业则主要考察学生的编程能力和理解程度;考试则是对学生整体掌握情况的考察;课堂讨论则主要评估学生的思考能力和团队合作精神。

评估方式将尽量客观、公正,确保全面反映学生的学习成果。

六、教学安排本节课的教学安排将紧凑、合理,确保在有限的时间内完成教学任务。

教学进度将按照教材的章节进行,每个章节安排2-3节课的时间。

教学时间将安排在正常上课时间内,地点则选择计算机实验室,以便学生进行实践操作。

同时,教学安排还将考虑学生的实际情况和需要,如学生的作息时间、兴趣爱好等,尽量让学生在舒适的环境中学习。

数据结构课程设计报告(约瑟夫问题)

数据结构课程设计报告(约瑟夫问题)

数据结构课程设计报告(约瑟夫问题)问题描述约瑟夫问题:编号为1-n的n个人围坐圆桌旁,从任一指定编号为k的人开始报数,报数为m的人离开圆桌,下一个人接着从n开始报数, 报数为m的人又离开圆桌,依此重复,直至所有人离开圆桌.编一程序,输出离开圆桌的人的编号序列.设计思想首先采单循环链表建立整个约瑟夫环,手动输入总人数(既链表的长度)、每个人的所持下一轮报数出对值和初始报数值。

node->num为人的编号,node->为此人所持的下一轮报数值。

建立单循环链表后,通过初始报数值找到出列的人,输出node->num的值,然后将该结点中的data值作为下一轮的报数值。

重复以上过程直至所有的人都出列,则程序结束。

主要算法do{k=1;while(k!=m)//当k=m时,结束第一轮报数{p1=p1->next;k++;}//报数中将指针指向下一位p2=p1->next;p1->next=p2->next;//把报数为m的人的结点从链表中删除printf("编号为%d的人出列,他的key%d作为新的m值/n",p2->num,p2->data);//m=p2->data;//报数为m的人的密码作为下一轮新的m值free(p2);//释放报m的人的结点}while(p1->next!=p1);//当p1->指向自己时,报数结束的值加一,当k=m时,此时p1指向人出列,p2指向该结点的上一结点,k为计数器,指针每移动一次,k让上一结点的next指向该结点的下一结点,然后删除该结点。

P1指向该结点下一结点,令k=1,再开始下一轮报数。

等到所有人出列后,循环结束。

for(i=1;i<=n;i++){printf("请输入%d号同学的key",i);scanf("%d",&j);//输入学生所带有的密码p1->next =(listnode*)malloc(sizeof(listnode));//建立一个空间p1=p1->next ;p1->data=j;p1->num=i;//对结点的num和data成员赋值p1->next=head->next; }定义指针p1,然后建立一个新结点并将p1->next指向他,再将地址赋给p1,最后将head->next赋给p1->next,构成了循环单链表,然后让所有人键入链表并给num和data成员赋值。

.Joseph环课程设计

.Joseph环课程设计

目录1.需求分析说明1.Joseph环的总体功能要求2. 各功能模块的功能描述3. 需要测试的数据2.概要设计说明1. 程序流程图2. 模块调用图3.详细设计说明1. 主函数模块2. 节点数据结构体定义模块3.单向循环链表创建模块4.结点删除模块5.输入子模块4.调试分析5.用户使用说明6.课程设计总结7.测试结果8.参考书目一、需求分析说明1. Joseph环的总体功能要求:Joseph环的总体目标:在Microsoft Visual C++ 6.0 的开发环境下,利用所学C语言和数据结构的相关知识,编写约瑟夫环(Joseph)问题的程序,要求如下:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。

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

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

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

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

其中的功能主要分为四项:(1)界面友好,易与操作。

(2)要求使用单向循环链表模拟过程(3)输入报数上限值m和人数上限n,密码值,均限定为正整数,输入的形式为一个以“回车符”为结束标志的正整数。

(4)演示程序以人机对话的形式进行,提供用户从键盘输入,Joseph 约瑟夫环的必要数据,并显示出列顺序2. 各功能模块的功能描述:(1)主函数模块本模块的主要功能是初始化图形界面,调用各模块,实现软件功能。

(2)节点数据结构体定义模块本模块的主要功能是进行数据对象及数据关系的创建(3)单向循环链表创建模块本模块的主要功能是用一个循环链表表示joseph环,结构中有两个成员,其一为指向下一个人的指针,已构成joseph环的链,其二为该人的标记。

(4)结点删除模块本模块的主要功能是将结点的下一结点复制到该结点后后将其释放(5)输入子模块本模块的主要功能是进行光标定位,输出提示文字,并对用户输入数据进行处理。

c课程设计约瑟夫环

c课程设计约瑟夫环

c 课程设计约瑟夫环一、教学目标本节课的教学目标是让学生掌握约瑟夫环的原理和实现方法。

知识目标要求学生理解约瑟夫环的概念、算法原理及其在计算机科学中的应用;技能目标要求学生能够运用约瑟夫环算法解决实际问题;情感态度价值观目标要求学生培养团队合作意识,提高动手实践能力。

二、教学内容本节课的教学内容主要包括约瑟夫环的原理、算法实现及其应用。

首先,介绍约瑟夫环的基本概念,让学生了解其背景和应用场景;其次,讲解约瑟夫环算法的原理,引导学生理解算法的基本思路;最后,通过编程实践,让学生动手实现约瑟夫环算法,并探讨其在计算机科学中的应用。

三、教学方法为了达到本节课的教学目标,采用多种教学方法相结合的方式进行教学。

首先,运用讲授法,清晰地讲解约瑟夫环的原理和算法;其次,采用讨论法,引导学生探讨约瑟夫环算法的优缺点及改进方向;接着,运用案例分析法,分析约瑟夫环在实际问题中的应用;最后,通过实验法,让学生动手实践,巩固所学知识。

四、教学资源为了支持本节课的教学内容和教学方法的实施,准备以下教学资源:教材《计算机科学导论》、参考书《算法导论》、多媒体资料(包括约瑟夫环的动画演示和编程实例)、实验设备(计算机和网络设备)。

这些资源将有助于丰富学生的学习体验,提高教学效果。

五、教学评估本节课的评估方式包括平时表现、作业和考试三个部分。

平时表现主要评估学生在课堂上的参与程度、提问和回答问题的积极性等;作业主要评估学生对课堂所学知识的掌握程度;考试则全面测试学生对约瑟夫环原理和算法实现的掌握情况。

评估方式客观、公正,能够全面反映学生的学习成果。

六、教学安排本节课的教学安排如下:共4课时,每课时45分钟。

第一课时介绍约瑟夫环的概念和原理;第二课时讲解约瑟夫环算法的实现;第三课时进行编程实践,让学生动手实现约瑟夫环算法;第四课时进行课堂讨论和总结。

教学安排合理、紧凑,确保在有限的时间内完成教学任务。

七、差异化教学根据学生的不同学习风格、兴趣和能力水平,设计差异化的教学活动和评估方式。

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

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

约瑟夫环问题设计与实现摘要约瑟夫问题是由古罗马著名的史学家Josephus提出的问题演变而来,所以通常称为Josephus问题。

改进约瑟夫问题的描述是:编号为1,2,…,n的n 个人按顺时针方向围坐一圈, 每人有一个密码m(整数),留作其出圈后应报到m后出圈,依次类推,即可求出出列顺序。

因此约瑟夫环问题如果采用循环链表则能很好的解决。

循环链表的数据结构,就是将一个链表的最后一个节点指针指向第一个结点。

出列时,根据密码找到对应的人,打印其编号,将其密码赋值给m后,释放节点,形成新的约瑟夫环,直到所有人出列结束。

关键字:约瑟夫环;循环链表;出列顺序;释放节点;Design and Realization of the Joseph ringABSTRACTThe Joseph problem is the evolution proposed by ancient Rome famous historian Josephus and come, so often referred to as the Josephus problem. Improvement of Joseph problem description is: No. 1, 2,... N, n individuals according to a clockwise direction around a circle, each with a password of M (integer), keep the ring should be reported after the M ring, and so on, we can calculate the column order. So Joseph circle if using circular linked list can be very good solution. Circulation list data structure, is the last of a node is a pointer to a list of the points to the first node. Out, according to the code to find the corresponding person, print the number, the password is assigned to m, release the node, the formation of Joseph ring, until all the people out of the end.Keywords: Joseph ring; circular linked list; the column order release nodes;目录1需求分析 (1)1.1课题内容 (1)1.2要求 (1)2概要设计 (1)3详细设计 (2)3.1程序中的数据类型 (2)3.2函数运行过程详解 (3)4设计和调试分析 (6)4.1调试中遇到的问题 (6)4.2经验和体会 (7)5用户使用说明 (7)6测试数据和测试结果 (8)参考文献 (10)1 需求分析1.1课题内容:(1)本演示程序中,人数n应为任意的,首先应输入一个值赋给初始报数上限m,程序应能自动保存出列人的序号和将出列的人所持的密码赋给m,再次作为报数上限,如此循环,直至所有人都出列为止。

约瑟夫环问题可惜设计

约瑟夫环问题可惜设计

1.设计1 约瑟夫环问题一、需求分析1、利用单向循环链表存储结构模拟此过程,按照出列的顺序印出个人的编号,只适用于一个案例。

具体目标包括:(1)实现单循环链表的初始化;(2)理解约瑟夫环的定义,用循环找到每次报数人的序号;(3)从单循环链表中删除节点,并判断链表空与非空的临界条件。

2、构造一个含有n个元素的单向循环链表3、程序中,先输入总人数PN与初始密码SN,再输入输入n 个正整数,作为这n个人的密码,接下来初始密码m。

4、测试数据PN=5 SN=2 ,N 个人的密码依次= 1 4 6 4 8。

出列为:2 1 3 5 4。

二、概要设计1、函数功能在main函数中实现void main(void){int PN, SN,i;LinkList L;printf("请输入总人数PN,和出示密码SN:");scanf("%d%d",&PN,&SN);int a[N];a[0]=SN;//将a[0]保存为初始密码printf("请输入%d个人各自所持的密码:\n",PN);for(i=1;i<PN+1;i++)scanf("%d",&a[i]);//创建链表CreatLinkList(&L, PN);//报数删人,输出结果printf("Result:\n");deldata(&L,PN,a);}2、程序包括两部分(1)结点类型(2)main函数实现约瑟夫环三、详细设计1、结点类型typedef struct Node{int data;//将这一圈人按从1~PN贴上序号struct Node *next;}Node,*LinkList;LinkList head;2、构建一个单循环链表算法void CreatLinkList(LinkList *L,int PN){Node *p, *q;int i;(*L) = (LinkList)malloc(sizeof(Node));p = (*L);{p=q;}}流程图:2取每次将要删除的人的密码,用于下次报数的上限.通过指针依次删除出列人相应的节点,直到该链表中无节点,退出循环。

约瑟夫环-课程设计

约瑟夫环-课程设计

目录1题目 (1)1.1问题描述 (1)1.2功能要求 (1)2算法思想描述: (1)2.1算法概述: (1)2.2算法具体分析 (2)3 程序结构 (3)3.1主函数流程图 (3)3.2 josephus()函数流程图 (4)4 实验结果与分析 (5)4.1实验测试中的关键代码与各模块测试结果的分析与说明 (5)4.2试验过程中所遇到的问题分析与解决 (11)5课程设计总结 (12)参考文献 (13)1题目约瑟夫环1.1问题描述编号为1,2… n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。

一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列顺序。

1.2功能要求A利用单循环链表作为存储结构模拟此过程;B键盘输入总人数、初始报数上限值m及各人密码;C按照出列顺序输出各人的编号。

2算法思想描述:2.1算法概述:建立一个循环单链表,然后输入要建立结点的个数,在每个结点输入一个密码,同时按输入时的顺序进行编号:1,2,3,4, ……n.任选一个正整数x作为初始报数上限值.从定义的那个头结点开始,数到x,输出该结点所储存的编号和密码.并将该密码作为新的x值,同时还将该密码所在的结点删除.如此循环链表还剩最后一个数据的时候停止此循环.再将最后一个没在循环里面的编号和密码另外输出.循环链表如图1所示:图22.2算法具体分析(1)window(),switch(),upbar(), downbar(),key()这几个函数是构建本程序菜单所必须的函数.window()用于开窗口,以坐标的形式开辟一个窗口,并且可以在窗口里面储存数据.switch()创建菜单选项,key()主要用于获取键盘上的字符(包括字母和方向键,enter键),upbar()和 downbar()实现光条的上移和下移. textbackground(),textcolor()。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告
课程名称:数据结构课程设计课程设计题目:约瑟夫环问题
姓名:余明旭
系:计算机科学与技术专业:计算机科学与技术年级:2010级
学号:100310236
指导教师:陈老师
职称:学生
一、需求分析
1、输入的形式和输入值的范围:
本程序中,输入报数上限值n,初始报数者s,初始报数者携带的密码m1,n-2个人携带的密码m(最后一人携带的密码没用),均限定为正整数,输入的形式为一个以“回车符”为结束标志的正整数。

2、输出的形式:
从屏幕显示出列顺序。

3、程序所能够达到的功能:
提供用户从键盘输入,Joseph约瑟夫环的必要数据,并显示出列顺序。

4、测试数据:
输入
8
1
4
4 4 4 4 4 4
输出
4 8
5 2 1 3 7 6
一、详细设计
以单向循环链表实现该结构:
1、抽象数据类型的定义为:
struct LNode
{
ElemType data;
LNode* next;
};
2、本程序包含以下模块:
主程序模块:
Void main()
{
初始化;
输入数据;
执行功能;
显示结果;
}
各功能模块:实现单链表的各项功能。

Void fun()
{
}
3、各模块的调用关系:
三、调试分析
程序的编写和调试基本正常,遇到的问题主要是:指针的指向的边界问题,如何每次正确找到出列的人的位置。

解决方法:
for(int j=1;j<a[i];j++)
{ ap=cp; cp=cp->next; if(cp==HL) { ap=HL; cp=HL->next; } }
a[i]中存储了每个人的密码,就可以准确知道每个人的位置。

通过约瑟夫环算法的课题设计让我理解了循环队列,不单单只是书本上文字的循环队列的概念,更多是自己能够通过实际的操作对循环队列有了更深的了解。

上机的编程的过程是对数据结构的基础的进一步的巩固。

学习过程体验到了学习的乐趣,实验课题使我认识到平时学习的漏洞和知识的缺乏,为以后的学习敲了一下警钟,数据结构是门基础,要学习扎实才行。

数据结构是在整个计算机科学与技术领域上广泛被使用的术语。

它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。

数据结构有逻辑上的数据结构和物理上的数据结构之分。

逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安 排。

数据结构是数据存在的形式。

数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。

数据结构课程的主要目的是介绍一些常用的数据结构,阐明数据结构内在的逻辑关系,讨论它们在计算机中的存储表示,并结合各种数据结构,讨论对它们实行的 各种运算的实现算法。

很多算法实际上是对某种数据结构施行的一种变换,研究算法也就是研究在实施变换过程中数据结构的动态性质。

学习的过程需要合作,而且在合作中提到自己的编程水平,借鉴他人好的地方,改掉原先自己不足,书本知识的与实际的联系,使自己的编程不在局限于原来的纸上谈兵,更多的是积累了经验,培养了能力。

四、用户手册
如何使用,详细步骤,根据提示输入。

示例:
主程序
Void main() 模块 Viod fun()
五、测试结果
六、附录带注释的源程序
#include<iostream.h>
typedef int ElemType;
#define N 100
struct LNode
{
ElemType data;
LNode* next;
};
void fun(int n,int s,int a[N])
{
LNode *HL=new LNode; //生成的结点带有头结点,此时循环单链表为空
HL->next=HL;
int i;
for(i=n;i>=1;i--) //生成带有n个结点的循环单链表
{
LNode *r=new LNode; //生成新的结点
r->data=i;
r->next=HL->next; //把新的结点插入到表头
HL->next=r;
}
LNode *ap=HL;
LNode *cp=HL->next;
for(i=1;i<s;i++)
{ //从表头开始顺序查找出第一个开始报数的人
ap=cp;
cp=cp->next;
if(cp==HL)
{
ap=HL;
cp=HL->next;
}
}
for(i=1;i<n;i++)
{ //顺序查找出待出列的人
for(int j=1;j<a[i];j++)
{
ap=cp;
cp=cp->next;
if(cp==HL)
{
ap=HL;
cp=HL->next;
}
}
cout<<cp->data<<" "; //输出出列的人
ap->next=cp->next;
delete cp;
cp=ap->next;
if(cp==HL)
{
ap=HL;
cp=HL->next;
}
}
cout<<HL->next->data<<endl; //使最后一个人出列
}
void main()
{
int b[N]={0};
int n,m,s;
cout<<"请输入人数上限值n:";
cin>>n;
cout<<"**********************************************"<<endl;
cout<<"请输入第1个报数的人序号:";
cin>>s;
cout<<"**********************************************"<<endl;
cout<<"请输入1个正整数作为初始报数者携带的密码:";
cin>>m;
b[1]=m;
cout<<"**********************************************"<<endl;
cout<<"请输入n-2个人持有的密码:";
for(int i=2;i<n;i++)
{
cin>>m;
b[i]=m;
}
cout<<"出列的顺序为:";
fun(n,s,b);
}。

相关文档
最新文档