课程设计(约瑟夫环)[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 课程设计约瑟夫环一、教学目标本课程的目标是让学生理解和掌握约瑟夫环的原理及其在计算机科学中的应用。
知识目标包括:了解约瑟夫环的概念、算法实现和数学原理;技能目标涵盖:能够使用至少一种编程语言实现约瑟夫环算法,并进行简单的性能分析;情感态度价值观目标强调:培养学生的逻辑思维能力,激发他们对计算机科学和算法研究的兴趣。
二、教学内容教学内容围绕约瑟夫环的理论基础和实际应用展开。
首先介绍约瑟夫环的基本概念,然后通过编程实践让学生深入理解算法的工作原理。
具体包括:1.约瑟夫环的定义及其在计算机科学中的应用。
2.约瑟夫环算法的不同变体及其实现方法。
3.循环队列的概念及其在约瑟夫环算法中的作用。
4.通过编程练习,掌握至少两种不同的编程语言实现约瑟夫环算法。
三、教学方法为了提高学生的理解能力和实践技能,将采用多种教学方法相结合的方式:1.讲授法:用于解释约瑟夫环的基本概念和数学原理。
2.案例分析法:通过分析具体的约瑟夫环应用实例,加深学生对知识点的理解。
3.实验法:安排实验室实践环节,让学生亲自编写代码实现算法。
4.分组讨论法:鼓励学生在小组内交流想法,共同解决问题,培养团队协作能力。
四、教学资源为了支持课程的顺利进行,将准备以下教学资源:1.教材:《计算机科学基础》相关章节。
2.参考书籍:提供关于算法和数据结构的进阶阅读材料。
3.多媒体资料:制作PPT和视频教程,辅助学生理解复杂概念。
4.编程环境:为学生提供合适的编程环境和在线编程平台。
5.实验设备:确保实验室中每名学生都有足够的机器进行编程实践。
五、教学评估教学评估是衡量学生学习成果的重要手段。
本课程的评估方式包括:平时表现(30%)、作业(20%)、小测验(20%)、实验报告(20%)和期末考试(10%)。
平时表现评估将基于学生的课堂参与、提问和小组讨论;作业将主要是编程练习,旨在巩固课堂所学;小测验将定期进行,以检查学生的理解程度;实验报告将评价学生对实验操作的理解和分析能力;期末考试将涵盖所有课程内容,测试学生的综合理解能力。
数据结构课程设计-joseph环

沈 阳 大 学
课程设计说明书
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);
}。