约瑟夫环课程设计
数据结构课程设计 约瑟夫环问题(报告+代码)
学院计算机与信息工程系数据结构课程设计设计题目:约瑟夫环问题专业班级学号姓名指导教师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.调试分析在本次试验调试中很不顺利。
数据结构课程设计约瑟夫环
武汉轻工大学数学与计算机学院《数据结构》课程设计说明书题目:哈希表设计专业:班级:学号:姓名:指导老师:2014年12 月24 日目录一、问题描述二、需求分析1、基本要求2、测试数据三、程序流程四、详细设计五、测试分析六、课程设计总结一、问题描述针对班级同学的“名字”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。
二、需求分析基本要求:假设人名为中国人姓名的汉语拼音形式。
待填入哈希表的人名共有30个,取平均查找长度的上限为2。
哈希函数用除留余数法构造,用伪随机探测再散列法处理冲突。
测试数据:取班级同学的30个人的姓名。
三、程序流程图1.1程序的整体流程图1.2姓名表的创建图1.4哈希表的查找四、详细设计#include<stdio.h>#include<time.h>//time用到的头文件#include<stdlib.h>//随机数用到的头文件#include<ctype.h>//toascii()用到的头文件用于将拼音的ASCII码的值作为关键字#include<string.h>//字符类的头文件#define HASH_LEN 30 //哈希表的长度#define P 27 //小于哈希表长度的P用于做除数#define NAME_LEN 30 //姓名表的长度typedef struct//姓名表{char *py; //名字的拼音int m; //拼音所对应的 ASCII总和}NAME;NAME NameTable[HASH_LEN]; //全局定义姓名表typedef struct//哈希表{char *py; //名字的拼音int m; //拼音所对应的ASCII总和int si; //查找长度}HASH;HASH HashTable[HASH_LEN]; //全局定义哈希表int d[30] ,i,j; //全局定义随机数,循环用的i、jvoid InitNameTable() //姓名表的初始化{printf("请输入30个同学的姓名\n");for (int i = 0; i < 30; i++){char name[20];scanf_s("%s", name, 20);NameTable[i].py = new char[20];strcpy(NameTable[i].py, name);}for (int i = 0; i<NAME_LEN; i++) //将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字{int s = 0;char *p = NameTable[i].py;for (j = 0; *(p + j) != '\0'; j++)s += toascii(*(p + j));//将拼音中每个字母的ASCII码相加NameTable[i].m = s;}printf("姓名表生成成功");system("pause");system("cls");}void CreateHashTable() //建立哈希表{for (i = 0; i<HASH_LEN; i++)//初始化哈希表将哈希表中的值都初始化为0用于判断{HashTable[i].py = "\0";HashTable[i].m = 0;HashTable[i].si = 0;}for (i = 0; i<NAME_LEN; i++){int sum = 1, j = 0;int adr = (NameTable[i].m) % P; //除留余数法 H(key)=key MOD p,p<=m 此时用拼音的ASCII码总值作为关键字if (HashTable[adr].si == 0) //如果不冲突,将姓名表赋值给哈希表{HashTable[adr].m = NameTable[i].m;HashTable[adr].py = NameTable[i].py;HashTable[adr].si = 1;}else//如果冲突{while (HashTable[adr].si != 0){adr = (adr + d[j++]) % HASH_LEN; //伪随机探测再散列法处理冲突sum = sum + 1; //查找次数加1}HashTable[adr].m = NameTable[i].m; //将姓名表复制给哈希表对应的位置上HashTable[adr].py = NameTable[i].py;HashTable[adr].si = sum;}}}void DisplayNameTable() //显示姓名表{printf("\n地址 \t\t 姓名 \t\t 关键字\n");for (i = 0; i<NAME_LEN; i++)printf("%2d %18s \t\t %d \n", i, NameTable[i].py, NameTable[i].m);}void DisplayHashTable() // 显示哈希表{float asl = 0.0;printf("\n\n 地址 \t\t 姓名 \t\t 关键字 \t 搜索长度\n"); //显示的格式for (i = 0; i<HASH_LEN; i++){printf("%2d %18s \t\t %d \t\t %d\n", i, HashTable[i].py, HashTable[i].m, HashTable[i].si);asl += HashTable[i].si;}asl /= NAME_LEN; //求得ASLprintf("\n\n平均查找长度:ASL(%d)=%f \n", NAME_LEN, asl);}void FindName() //查找{char name[20] = { 0 };int s = 0, sum = 1, adr;printf("\n请输入想要查找的姓名的拼音:");scanf_s("%s", name,20);for (j = 0; name[j]!=’\0’; j++) //求出姓名的拼音所对应的ASCII作为关键字s += toascii(name[j]);adr = s%P; //除留余数法j = 0;if (HashTable[adr].m == s&&!strcmp(HashTable[adr].py, name)) //分3种情况进行判断,并输出超找结果printf("\n姓名:%s 关键字:%d 查找长度为: 1\n",HashTable[adr].py, s);else if (HashTable[adr].m == 0)printf("没有想要查找的人!\n");else{while (1){adr = (adr + d[j++]) % HASH_LEN; //伪随机探测再散列法处理冲突sum = sum + 1; //查找次数加1if (HashTable[adr].m == 0){printf("没有想要查找的人!\n");break;}if(HashTable[adr].m == s&&!strcmp(HashTable[adr].py, name)){printf("\n姓名:%s 关键字:%d 查找长度为:%d\n", HashTable[adr].py, s, sum);break;}}}}void showtable(){puts("\n********************************************************* *********");puts("\n********************************************************* *********");puts("\n*-------------------------哈希表设计-----------------------------*");puts("\n********************************************************* *********");puts("\n********************************************************* *********");}void show(){puts("\n*----------------------------菜单栏------------------------------*");puts(" \t\t\t 1. 显示姓名表");puts(" \t\t\t 2. 显示哈希表");puts(" \t\t\t 3. 查找");puts(" \t\t\t 4. 退出 ");puts("*----------------------------------------------------------------*");}int main() //主函数{ int a;srand((int)time(0));//表示以当前时间对应的int值为随机序列起点,这样每次运行程序,由于起点不同才可以得到不同的随机数为位随机数法再排列提供随机数for(i = 0; i<30; i++)//用随机函数求得伪随机数列d[i](在1到30之间)d[i] = 1 + (int)(HASH_LEN*rand() / (RAND_MAX + 1.0));showtable();InitNameTable();CreateHashTable();start:showtable();show();restart:printf("\n\t请选择:");scanf_s("%d", &a);switch (a) //根据选择进行判断,直到选择退出时才可以退出{case 1:DisplayNameTable();break;case 2:DisplayHashTable();break;case 3:FindName();break;case 4:exit(0);break;default:printf("\n请输入正确的选择!\n");goto restart;}printf("执行成功\n");system("pause");system("cls");goto start;}五、测试分析测试数据:随机输入的30个人的姓名拼音测试过程:输入30个人的姓名拼音,观察输出结果,并进行查找操作测试结果:图2.1进入界面图2.2输入三十个同学姓名界面图2.3输入完后选择界面图2.4生成的姓名表的界面图2.5生成的哈希表的界面图2.6实现查找功能六、课程设计总结通过这次课程设计加强了我对于数据结构的进一步理解,提高了综合运用本课程所学知识的能力。
约瑟夫环课程设计
一、问题描述约瑟夫问题是由古罗马著名的史学家Josephus提出的问题演变而来,所以通常称为Josephus问题。
改进约瑟夫问题的描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈, 每人有一个密码(整数),留作其出圈后应报到后出圈。
报数方法采用顺时针报数和逆时针报数交替进行,初始密码可任意确定。
求最后剩下的人的编号。
这个就是约瑟夫环问题的实际场景,后来老师要求我们对要求中的每人所持有的密码以及第一次的报数上限值要用随机数产生。
因此约瑟夫环问题如果采用双向循环链表则能很好的解决。
循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。
p->link=head解决问题的核心步骤:先建立一个具有n个链结点,无头结点的循环链表,然后确定第一个报数人的位置,并不断地从链表中删除链结点,直到链表为空。
二、基本要求(1)输出的形式:字符串形式输出(2)程序所能达到的功能:达到符合约瑟夫环要求的响应功能。
三、测试数据进入程序,显示“1.开始游戏0.退出游戏”输入非0数进入游戏,输入0退出游戏。
进入游戏后显示“输入总人数”,输入大于0的整数;若输入错误,则光标处清空,重新输入。
后提示“输入开始人的序号”;范围是大于零,小于总人数的整数,若输入错误,则光标处清空,重新输入。
后提示“输入间隔数字”,范围是任意正整数;若输入错误,则光标处清空,重新输入。
按回车键,显示结果,并重新询问“1.开始游戏0.退出游戏”。
四、算法思想首先,设计实现约瑟夫环问题的存储结构。
由于约瑟夫环本身具有循环性质,考虑采用循环链表,为了统一对表中任意节点的操作,循环链表不带头结点。
循环链表的结点定义为如下结构类型:typedef struct node{int data;struct node *next;}LNode;其次,建立一个不带头结点的循环链表并由头指针p指示。
最后,设计约瑟夫环问题的算法。
1、工作指针first,r,s,p,q初始化2、输入人数(n)和报数(m)3、循环n次,用尾插法创建链表int start=k-1;LNode *s,*p,*L=0,*t;if (start==0) start=n;while (n!=0){s=(LNode *)malloc(sizeof(LNode));if (L==0) p=s;if (n==start) t=s;s->data=n;s->next=L;L=s;n--;}p->next=L;return t;}LNode* GetNode(LNode *p)/*出队函数*/{LNode *q;for (q=p;q->next!=p;q=q->next);q->next=p->next;free (p);return (q);}4、输入报数的起始人号数k;5、循环n次删除结点并报出位置(其中第一个人后移k个)当i<n时移动指针k-1次s->next=L;删除p结点的后一结点qq=p;q->next!=p;q=q->nextq->next=p->next;报出位置后free q;计数器i++;五、模块划分输入总人数n创建并初始化n个结点输入第一个报的数kn==0报数过程输出出列者的编号及密码结束n--图5-1 流程关系图六、数据结构通过对问题的分析,给出该课程设计需要使用的数据结构的类型定义,并阐述定义理由。
数据结构课程设计约瑟夫环
《数据结构》课程设计报告书题目:约瑟夫环系别:计算机科学与应用学号:学生姓名:指导教师:完成日期:2012年6月7日目录1.需求分析 (3)1.1 功能分析 (3)1.2开发平台 (3)2.概要设计 (3)3. 程序设计主要流程 (5)4.调试与操作说明 (5)4.1调试情况 (5)4.2操作说明 (6)总结 (8)致谢 (9)附录 (9)参考文献 (13)指导教师评语: (14)1.需求分析1.1 功能分析本次选做的课程设计是改进约瑟夫(Joseph)环问题。
约瑟夫环问题是一个古老的数学问题,本次课题要求用程序语言的方式解决数学问题。
此问题仅使用单循环链表就可以解决此问题。
在建立单向循环链表时,因为约瑟夫环的大小由输入决定。
为方便操作,我们将每个结点的数据域的值定为生成结点时的顺序号和每个人持有的密码。
进行操作时,用一个指针r指向当前的结点,指针H指向头结点。
然后建立单向循环链表,因为每个人的密码是通过scanf()函数输入随机生成的,所以指定第一个人的顺序号,找到结点,不断地从链表中删除链结点,直到链表剩下最后一个结点,通过一系列的循环就可以解决改进约瑟夫环问题。
1.2开发平台WindowsXP操作系统;Microsoft Visual C++ 6.0;2.概要设计编号为1,2… n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列顺序。
这个问题采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。
r->next=H。
解决问题的核心步骤:首先建立一个具有n个链结点,无头结点的循环链表。
然后确定第1个报数人的位置。
最后不断地从链表中删除链结点,直到链表为空。
(完整word版)约瑟夫环课程设计实验报告
《数据结构》课程设计报告课程名称:《数据结构》课程设计课程设计题目: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; //顺序int code; //密码LinkNode *next;};建立一个类LinkList ,包含的函数:LinkList(); //构造函数void Creat(const int ); //创建循环链表int Delete(LinkNode* ); //删除报到数的结点int Joseph(int ); // 约瑟夫环私有成员是LinkNode* head; //指向第一个结点的指针LinkNode* elem; // 同上int len; //长度我定义了一个elem指针是为了约瑟夫环里运行方便,elem只在约瑟夫环这个函数里用到,其他函数没有特别大的用处。
数据结构 约瑟夫环课程设计报告
课程设计报告一、需求分析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)。
约瑟夫环问题课程设计报告
数据结构课程设计报告设计课题:约瑟夫问题院系:计算机科学与技术学院专业班级:计算机网络技术1102班学生姓名:张利学号: 1 1 0 8 0 4 0 2 1 1 指导教师:王昱哲目录1.需求分析 (3)1.1问题描述 (3)1.2功能分析 (4)2.概要设计 (5)3.详细设计 (6)4.调试与操作说明..................... 1错误!未定义书签。
总结 (16)一.需求分析1.1问题描述约瑟夫环问题描述的是:设编号为1,2,…,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一正整数密码。
开始时选择一个正整数作为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出圈,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新从1报数。
如此下去,直到所有人都出圈为止。
令n最大值为100。
要求设计一个程序模拟此过程,求出出圈的编号序列。
如下图分析:1 23456789这是第一个人,他的密码是“1”,个他输一个m 值,如果m=3,则从他开始向下走3个这就是第二步的位置,这时他的密码作为新的m 值,即m=4,同时得到的第一个密码为4;4号出去向下走4,到9这儿;(这这一步完了剩余的为:1,2,3,5,6,,7,8,9,0,)这就是第三步的位置,这时他的密码作为新的m 值,即m=9,同时得到的第二个密码为9;9号出去向下走9,到0这儿;继续走就行了(这儿剩余的就是:1,2,3,5,6,7,8,0)图1约瑟夫环问图解1.2功能分析约瑟夫环问题是一个古老的数学问题,本次课题要求用程序语言的方式解决数学问题。
此问题仅使用单循环链表就可以解决此问题。
而改进的约瑟夫问题通过运用双向循环链表,同样也能方便地解决。
在建立双向循环链表时,因为约瑟夫环的大小由输入决定。
为方便操作,我们将每个结点的数据域的值定为生成结点时的顺序号和每个人持有的密码。
进行操作时,用一个指针current 指向当前的结点,指针front 始终指向头结点。
约瑟夫(Josephu)环C++课程设计数据结构汇编
前言
塔里木大学信息工程学院课程设计
1.1 背景和意义
数据是计算机化的信息,它是计算机可以直接处理的最基本和最重要的对象。无论是进 行科学计算或数据处理、过程控制以及对文件的存储和检索及数据库技术应用等,都是对数 据进行加工处理的过程。
因此,要设计出一个结构好效率高的程序,必须研究数据的特性及数据间的相互关系及 其对应的存储表示,并利用这些特性结合相关编程技术,运用合适、熟练的方法,才能设计 出符合要求、可操作性强、有利用价值的应用程序。
}
(3).删除操作
同插入操作一样删除操作也是利用的以前对链表的操作加以简单改编而成,在本程序中
(1).构造 Josephu 链表:
由于是应用了类的结构,在 main()函数又有选择语句,直接构造回产生错误所以我在
构 造 最 初 的 Josephu 链 表 时 运 用 了 两 个 函 数 JosephuLink() 函 数 和 putin() 函 数 。
JosephuLink()函数能构造一个空链表而 putin()函数则往其中放入初始值。
从上述分析可见,在 C++中不能用动态分配的一维数组来实现循环队列。如果用户的应 用程序中设有循环队列,则必须为它设定一个最大队列长度;若用户无法预估所用队列的最 大长度,则宜采用链队列。
2.3.2 设计程序
编写本实验设计程序采用 C 语言和 C++想结合的方法,在允许中文环境下运行。本设计
程序下:
约瑟夫(Josephu)问题:已知 N 个人围坐在一张圆桌周围(不妨以 1,2,……,N 对 每一个人依次编号),现在先从序号为 K 的人开始报数,数到 m 的那个人出列,他的下一个 人又从 1 开始数,报数到 m 的人出列……直到所有人都出列为止。
数据结构课程设计报告(约瑟夫问题)
数据结构课程设计报告(约瑟夫问题)问题描述约瑟夫问题:编号为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环课程设计
目录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)输入子模块本模块的主要功能是进行光标定位,输出提示文字,并对用户输入数据进行处理。
数据结构-约瑟夫环
江西农业大学软件学院数据结构课程设计设计题目:约瑟夫环问题专业软件工程班级软件1014学号20102073姓名周洋指导教师史劲亭2011年12月20日约瑟夫环一、需求分析设计题目:约瑟夫环问题描述:编号为1,2… n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列顺序。
基本要求:1.利用单向循环链表存储结构模拟此过程。
2.按照出列的顺序输出各个人的编号。
3.测试数据。
二、概要设计实验设计思路:1.以无头结点的单循环链表为存储结构模拟此过程。
2.键盘录入各各同学所持密码,存储在一维数组a[]中。
3.单循环链表初始化时,将密码和编号存入结构体中。
4.进行单链表删除操作,直到链表为空,输出的编号存入数组b[]中5.依次输出b[]中的元素。
程序结构:本程序是单文件程序,构成的函数有LinkedList LinkedListInit(int n,int a[]) 初始化循环单链表void LinkedListTraverse(LinkedList L) 遍历单链表void Play(LinkedList L,int m,int b[],int n) 单循环链表的删除void main() 主函数,输出出队序列其中,void Play()是最主要的函数,初始化单链表后,开始执行该函数,指针按给定的密码值m依次后移m次删除定位后的结点,输出编号,同时获得新的m值,继续循环,直到该链表为空。
三、详细设计1.头文件(保存在主程序文件夹内)typedef struct node{DataType data;struct node *next;}SCLNode;void SCLLInitiate(SCLNode **head){if((*head=(SCLNode *)malloc(sizeof(SCLNode)))== NULL) exit(1);(*head)->next= *head;}int SCLLInsert(SCLNode *head, int i, DataType x){SCLNode *p, *q;int j;p=head->next; j=1;while(p!=head&&j<i-1){p=p->next; j++;}if(j!=i-1&&i!=1){printf("插入位置参数错!");return 0;}if((q=(SCLNode *)malloc(sizeof(SCLNode)))==NULL) exit(1);q->data=x;q->next=p->next;p->next=q;return 1;}int SCLLDelete(SCLNode *head, int i,DataType *x){SCLNode *p,*q;int j;p=head; j=0;while(p->next!=head&&j<i-1){p=p->next;j++;}if(j!=i-1){printf("删除位置参数错!");return 0;}q=p->next;p->next=p->next->next;*x=q->data;free(q);return 1;}int SCLLGet(SCLNode *head, int i,DataType *x) {SCLNode *p;int j;p=head; j=0;while(p->next!=head&&j<i){p=p->next; j++;}if(j!=i){printf("取元素位置参数错!");return 0;}*x=p->data;return 1;}int SCLLNotEmpty(SCLNode *head){if(head->next==head) return 0;else return 1;}2.主函数#include<stdio.h>#include<stdlib.h>typedef struct{int number;int cipher;}DataType;#include"SCLinList.h"void SCLLDeleteAfter(SCLNode *p){SCLNode * q=p->next;p->next=p->next->next;free(q);}void JesephRing(SCLNode *head,int m){SCLNode *pre,*curr;int i;pre =head;curr = head->next;while(SCLLNotEmpty(head)==1){for(i=1;i<m;i++){pre = head;curr = head->next;if(curr==head){pre=curr;curr=curr->next;}}printf("%d ", curr->data.number);m=curr->data.cipher;curr=curr->next;if(curr==head)curr=curr->next;SCLLDeleteAfter(pre);}}void main(void){DataType test[7]={{1,3},{2,1},{3,7},{4,2},{5,4},{6,4},{7,4}};int n =7,m=6,i;SCLNode *head;SCLLInitiate(&head) ;for(i=1;i<=n;i++)SCLLInsert(head,i,test[i-1]);JesephRing(head,m);}四、调试分析1.数据测试:按照实验指导书要求,m的初始值为20,n=7,7个人的密码依次为3,1,7,2,4,7,4,首先m=6。
约瑟夫环课程设计报告
C++ 课程设计报告课 题: 约瑟夫环 专业班级: 学 号: 姓 名: 指导教师:目 录评阅意见:评定成绩:指导老师签名:年 月 日1 课程设计的目的和意义 (2)2 需求分析 (3)3 系统(项目)设计 (4)(包括总体设计和详细设计) (4)一、设计思路及方案 (4)二、模块的设计及介绍 (4)(2)创建单循环链表函数流程图 (6)(3)删除结点函数(出队函数)程序流程图 (7)4 系统实现 (8)5 系统调试 (11)参考文献 (15)附录源程序 (16)1 课程设计的目的和意义数据结构是研究数据元素之间的逻辑关系的一门课程,以及数据元素及其关系在计算机中的存储表示和对这些数据所施加的运算。
该课程设计的目的是通过课程设计的综合训练,培养分析和编程等实际动手能力,系统掌握数据结构这门课程的主要内容。
本次课程设计的内容是用单循环链表模拟约瑟夫环游戏,循环链表是一种首尾相接链表,其特点是无须增加存储容量,仅对表的链接方式稍作改变,使表处理更加灵活,约瑟夫环问题就是用单循环链表处理的一个实际应用。
通过这个设计实例,了解单链表和单循环链表的相同与不同之处,进一步加深对链表结构类型及链表操作的理解。
通过该课程设计,能运用所学知识,能上机解决一些实际问题,了解并初步掌握设计、实现较大程序的完整过程,包括系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。
2 需求分析该程序所做的工作是约瑟夫环游戏,有以下内容和要求:1.本程序设计中,从键盘输入约瑟夫环游戏的总人数n和初始的报数上限m,然后给每个人输入所持有的密码key。
用单循环链表模拟约瑟夫环,从队头开始从1报数,报到m的人出列,再把此人的密码赋给m,继续下一轮的报数,直到所有的人出列。
2.演示程序以用户和计算机对话方式进行,根据提示信息由用户从键盘输入数据,以“回车符“为结束标志,运行后输出的结果是约瑟夫环的相关信息和经过报数后出队的人的序列号及相关信息。
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 数据结构描述 算法设计 2 详细程序清单 程序运行结果 心得体会 12
1 4 11
一、 问题描述 1. 约瑟夫问题描述 编号为1,2... n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一 开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报 数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的 下一个开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列 顺序。 2. 八皇后问题描述 在一个8×8的棋盘里放置8个皇后,要求每个皇后两两之间不相"冲"(在每一横 列竖列斜列只有一个皇后)。 3、界面设计模块问题描述 设计一个菜单式界面,让用户可以选择要解决的问题,同时可以退出程序。界面要 简洁明了,大方得体,便于用户的使用,同时,对于用户的错误选择可以进行有效的处 理。 二、 问题分析 在整个课程设计中,我主要负责的是约瑟夫问题中链表中的出列的操作算法的设计。 用循环单链表表示编号为1,2... n的n个人按顺时针方向围坐一圈,每人持有一个密码 (正整数)。一开始输入一个正整数作为报数的上限值turn,从第一个人开始按顺时针方 向自1开始顺序报数(即从第一个结点开始指针向后移动),报到turn-1时(即指针指向 turn-1个结点时)停止,他的下一位出列,将他的下一位密码作为新的turn值,从出列的 人的的顺时针方向上的下一个开始重新从1报数,如此下去,直至链表中只剩一位(即一 个结点)退出循环,并所有人的编号按出列顺序输出。在实现的过程中定义i表示报数的
int code; struct LNode *next; }node,*linklist; linklist creatstart(linklist L,int number) { int m,i; linklist s,p; s=L; for(i=1;i<=number;i++) { p=(linklist)malloc(sizeof(node)); if(!p) exit(0); p->data=i; printf("please input the code of number %d:",i); scanf("%d",&p->code); p->next=NULL; s->next=p; s=p; } s->next=L->next; return s; } void chulie(linklist L,int number) { int turn,i,j; linklist p,s; printf("please input the start code:"); scanf("%d",&turn); p=L; printf("the turn out of the circle is:"); for(i=1;i<=number-1;i++) { for(j=1;j<=turn-1;j++) p=p->next; printf("%d ",p->next->data); turn=p->next->code; s=p->next; p->next=s->next; free(s); } printf("%d ",p->next->data); printf("\n"); } void lianbiao() { int number; linklist L; L=(linklist)malloc(sizeof(node));
精品约瑟夫环课程设计
精品 约瑟夫环课程设计一、课程目标知识目标:1. 学生能理解约瑟夫环的概念,掌握其数学模型及相关术语。
2. 学生能够运用所学知识解决约瑟夫环问题,如计算生存者位置、推导出递推公式等。
3. 学生了解约瑟夫环问题在计算机科学、数学等领域的应用。
技能目标:1. 学生通过分析约瑟夫环问题,培养逻辑思维和问题解决能力。
2. 学生能够运用编程语言实现约瑟夫环问题的求解,提高编程能力。
3. 学生通过小组讨论,学会合作学习,提高团队协作能力。
情感态度价值观目标:1. 学生在解决约瑟夫环问题的过程中,体验数学和计算机科学的趣味性,培养学科兴趣。
2. 学生通过面对挑战,克服困难,培养坚持不懈、勇于探索的精神。
3. 学生了解约瑟夫环问题背后的历史故事,激发对科学家的敬仰之情,树立正确的价值观。
课程性质:本课程为信息技术与数学跨学科课程,结合实际问题,培养学生的逻辑思维、编程能力和团队协作精神。
学生特点:学生处于高年级阶段,具备一定的数学基础和编程能力,对新鲜事物充满好奇心,喜欢挑战性任务。
教学要求:课程注重理论与实践相结合,以学生为主体,鼓励学生主动探究、合作学习,充分调动学生的积极性。
通过本课程的学习,使学生能够将所学知识应用于实际问题的解决中。
二、教学内容1. 约瑟夫环概念介绍:通过故事引入约瑟夫环问题,讲解其背景和基本原理,使学生理解问题的实质。
教材章节:第五章“递推与递归”第一节“约瑟夫环问题”2. 约瑟夫环数学模型:引导学生建立数学模型,推导递推公式,探讨求解方法。
教材章节:第五章“递推与递归”第一节“约瑟夫环问题”3. 编程求解约瑟夫环问题:介绍编程语言中的循环、条件语句等基本语法,指导学生编写程序求解约瑟夫环问题。
教材章节:第六章“程序设计基础”第二节“循环结构与应用”4. 约瑟夫环问题拓展与应用:分析约瑟夫环问题在计算机科学、数学等领域的应用,提高学生的问题解决能力。
教材章节:第五章“递推与递归”第三节“递归算法与应用”5. 小组合作与实践:组织学生进行小组讨论,共同解决约瑟夫环问题,分享编程经验和心得。
数据结构课程设计报告Joseph环程序设计
JIANGXI AGRICULTURAL UNIVERSITY 数据结构课程设计报告题目:Joseph环程序设计学院:软件学院姓名: ******学号: 2020****专业:软件工程年级: 1012班指导教师:彭莹琼二0一一年12 月题目概要:joseph环任务:编号是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约瑟夫环的必要数据,并显示出列顺序。
4. 测试数据(1)输入20,7输出0 0 3 7 4 0 7 4 4二、概要设计利用单向循环链表存储结构模拟此进程,因为循环链表最后一个结点的指针域指向头结点,整个链表形成一人环,恰好和题中的“n个人依照顺时针方向围坐一圈,每一个人只有一个密码(正整数)”内容要求一致,而且,循环链表中任一结点动身都可找到表中其他结点,利用这一优势可较容易地找出报数的人及下一个报数的人,最后依照出列的顺序用一个for语句实现。
joseph环的组成成员由密码(password)和序号(No)组成,循环链表的存储结构如下:typedef struct LNode{int password;scanf ("%d",&(*p_head)->password); %d:\n",i);scanf("%d",&(p->password)); 碰到的问题主若是:指针的指向的边界问题,但依照运行程序时的犯错提示,专门快也就解决了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2011-2012学年第二学期《数据结构课程设计》课程设计报告计算机与信息工程系年月日目录1.课程设计介绍 (3)1.1 课程设计容 (3)1.2 课程设计要求 (3)2.课程设计原理与分析 (4)2.1 课程题目粗略分析 (4)2.2 原理图介绍 (4)3.数据结构分析 (8)3.1 单链表存储结构3.2单链表算法描述4. 调试与分析 (9)4.1.单链表调试过程4.2单链表程序执行过程4.3 运行时的界面显示5.数组实现简单的约瑟夫环 (11)6.参考文献 (13)7.课程设计体会与总结 (13)附录:1单链表实现约瑟夫环源代码 (14)2 数组实现简单约瑟夫环源代码 (16)1.课程设计介绍1.1课程设计内容1.2课程设计要求1.使用单循环链表作为储存结构,并模拟该过程;2.使用数组作为存储结构,并模拟该过程3.从键盘输入开始开始时的总人数、初始报数上限值m及每个人的密码;4.按照出列顺序输出各人的编号。
2.课程设计原理与分析2.1课程题目粗略分析2.1.1单链表的实现分析演示程序以用户和计算机的对话的方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入相应的数据(即每个人都所持的密码),每个人的序号由程序自动分配。
程序执行的命令包括:(1)构造链表;(2)输入数据;(3)执行报数,储存出列人的序号,删除出列人的信息以及把出列人的密码赋给m;(4)结束。
本程序包括三个模块:(1)信息录入(构造链表)模块。
此模块将对数据进行初始化,构造链表,并录入数据以便后续程序的使用。
(2)结果输出模块。
此模块将根据前面所输入的数据对数据进行处理,输出报数号码,删除报数节点,并继续进行处理。
(3)主程序模块。
此模块实现整个程序的进入和退出,及各种初始化处理。
2.2原理图介绍功能模块图为:数据流程图为:1.此部分为createlist函数。
首先初始化变量,再输出提示性语句,等待用户输入数据,将总人数和初始上限值分别存入num和m。
以num为上限值建立单循环链表,最后返回L。
2.此部分为printlist函数部分。
定义变量temp=m,从第一个人开始进行报数,指针q和p指向第一个人L,当q->next=p时,q=q->next;否则当q->next!=q时—temp,直到—temp!=0时输出p所指向的节点的num;重复以上处理直到q->next!=q为假时结束该函数。
3.此部分为主程序部分。
分别调用函数createlist和printlist,所有人输出,程序结束。
并通过while循环对程序进行重复使用。
3.数据结构分析本课程设计分别利用单循环链表和数组作为模拟约瑟夫的存储结构3.1 单链表的存储结构根据要求首先应该建立一个单循环链表,实现链式存储。
设置结构体存储节点:用结构体存储全体人数整型变量num和每个人的密码整型变量mm,用以指示下一结点的指针next。
结构体指针Linklist;。
struct node{int mark;int num;struct node *next;};typedef struct node Linklist;设置结构体指针p和q及表头指针L。
3.2 算法描述3.2 算法描述1.将人数的编号和相应的密码输入到单循环链表中,应用creatlist函数,输入总人数和初始上限值。
然后依次输入每个人的密码,循环n-1次。
设置指针p=(Linklist*)malloc(sizeof(node));如果头结点为空,将指针p=L=q;每人的号码编号赋值给指针p所指的人数p->num=i;q->next=p;然后将p所指的节点赋给q,q=p;依次循环,直到所有的节点都赋值完成。
赋值完成后,p->next=L;构成单循环链表的要求。
2.进行出圈的过程,所用的函数为Print函数。
因为上限值为全局变量值,所以在Print函数中用一个变量temp代替。
令temp=m; q->next=L;进行循环,条件为q->next!=q;因为为循环链表,所以判断最后指针是否指向自己,while(q->next!=q)。
在这循环体中,令变量temp逐步减1,判断是否为一,while(temp--!=1)。
循环体为q=p;p=p->next;当为1时,选中第一个出圈的人,并输出他的编号,printf("%d ",p->num);此时将他的编号赋值为新的上限值,temp=p->mark;q指向的下一结点为p所指向的下一节点,并进行删除节点操作free(p);将q的下一节点再次赋值给p, p=q->next ;重复以上的操作,知道所有的人都输出。
3.主程序模块部分,全局变量总人数n和初始上限值m,设置单循环链表的表头L,分别引用函数createlist 和printlist,本程序结束。
并通过while循环对程序进行重复使用。
4 调试与分析4.1 调试过程在调试程序是主要遇到一下几类问题:1.当输入此函数时出现了与&相关的错误,例如后面缺少括号以及分号等等以下的错误;2.输入每个人的密码值出现连贯相同数字时,程序有可能出现停止;3.在主程序中main() 前不加返回值变量类型,调试时出现逻辑错误;4.在定义结构体时,定义结构体指针变量为指针,程序运行时出现了定义的结构体指针不起作用。
4.2程序执行过程输入总人数:7输入上限值:3输入第一个人的密码:1输入第二个人的密码:2 输入第三个人的密码:3 输入第四个人的密码:4 输入第五个人的密码:5 输入第六个人的密码:6 输入第七个人的密码:7 出列顺序是:2 6 7 4 5 1 2继续(1.yes or 0.no)?1 ********************* 输入总人数:5输入上限值:4输入第一个人的密码:1 输入第二个人的密码:2 输入第三个人的密码:3 输入第四个人的密码:4 输入第五个人的密码:5出列顺序是:4 3 2 1 5继续(1.yes or 0.no)?0 ********************* 谢谢本次使用!4.3运行时的界面显示5.数组实现简单约瑟夫环1.使用数组实现约瑟夫环主要有四个函数协和完成,即:class JosephusCirclevoid JosephusCircle::input()void JosephusCircle::Josephus()void main()2.其功能模块图为:3.算法描述为:○1首先需要定义一个类函数,用于存放一些公共函数和所需的控制变量,控制变量包括约瑟夫圈人数,报数起始位置,首位置到末位置的循环控制,以及一个指针变量用于指向当前的人.○2构造一个函数 JosephusCircle用于输入约瑟夫圈人数,报数起始位置,所报个数,通过一个条件语句控制报数的个数不许为0!创建一个动态数组,舍弃数组的第一个,将有人的位置设置为1.○3构造一个函数JosephusCircle::Josephus()用于报数起点,剩余人数的判断,然后控制其出圈顺序,用一个while循环进行对错误位置的处理,其中包括对当前人是否为出圈的判断,若访问了出圈的人,则数组的下标加1,看下一个人,用一个循环判断是否出圈或者数组是不是应经到了尾部。
然后输出出圈顺序,出圈则标为0,剩余人数减1.○4在主函数中调用功能函数.4.数组实现约瑟夫环的调试**程序在调试过程中可能出现一些常见的逻辑错误,例如符号问题,主函数前不加返回值类型。
以及大括号的匹配问题。
**对程序的调试过程为:依次输入:: 5 1 2出圈顺序为: 2 4 1 5 3依次输入::6 3 3出圈顺序为: 5 2 6 4 1 35.程序运行界面为:6.参考文献[1] 严蔚敏,吴伟民.数据结构[M].北京:清华大学出版社,2007.[2] 张长海,陈娟.C程序设计[M].北京:高等教育出版社,2004.[3] 谭浩强,C程序设计[M].北京:清华大学出版社,2005.[4] 王杰,数据结构经典算法实现与习题解答[M].北京:人民邮电大学出版社,2004年[5] 张长海,陈娟.C程序设计[M].北京:高等教育出版社,2004年7.课程设计体会与总结通过本次课程设计使我深刻的意识到了自身的不足,以及在设计过程中应该持有怎样的心态,也促进了我对C语言和数据结构进一步学习,获得了很多以前没有遇到的处理问题的经验。
本次课程设计我通过两个方面来实现有趣的约瑟夫环的问题,其中把用单循与每个人的密码的存储结构。
设置结构体指针,并定义了两个指针类型的指针p与q;并编写了两个函数,链表构造函数和输出函数。
在约瑟夫环的设计中我也领悟到实现一种功能可以有各种不同的方法和数一个合格的程序员的话不仅要由严谨的逻辑能力和动手能力还有持久的耐心和毅力,以及在面对困难时应该具备的不畏困难的精神,这将激励我以后的学习和生活,此外也教会了我遇到自己解决不了的问题时要谦虚的向同学和老师请教,真正的做到“敏而好学,不耻下问”,此外,也感谢指导老师时老师的悉心教导!附录:1单链表实现约瑟夫环源代码#include<stdio.h>#include<malloc.h>int m=0,num=0;struct node{int mm;int num;struct node *next;};typedef struct node Linklist;Linklist *createlist(Linklist *L) //根据人数创建链表{int t;Linklist *p,*q;printf("请输入总人数: ");scanf("%d",&num);printf("请输入初始上限值: ");scanf("%d",&m);for(t=1;t<=num;t++){p=(node*)malloc(sizeof(node));printf("请输入第%d个人的密码: ",t);scanf("%d",&p->mm);p->num=t;if(L==NULL)L=q=p;else{q->next=p;q=p;}}p->next=L;return L;}void printlist(Linklist *L){int temp=m;Linklist *p,*q;printf("出列顺序是: \n");p=q=L;while(q->next!=p)q=q->next;while(q->next!=q){while(--temp){q=p;p=p->next;}printf("%d ",p->num);temp=p->mm;q->next=p->next;free(p);p=q->next ;}printf("%d\n",q->num);return;}void main(){int s=1;while(s!=0){Linklist *L=NULL;L=createlist(L);printlist(L);printf("继续?(1.yes or 0.no)");scanf("%d",&s);printf("************************\n");}printf("谢谢本次使用!\n");2 数组实现简单约瑟夫环源代码#include <iostream>using namespace std;class JosephusCircle{public:void input();void Josephus();private:int n;int s;int m;int *p;};void JosephusCircle::input(){cout<<"请依次输入,约瑟夫圈人数、报数起始位置、报几个数:"<<endl;cin>>n>>s>>m;if(m==0) { cout<<"报数的个数不许为0!"; cout<<endl; exit(1); }p=new int [n+2];for(int i=1;i<=n;i++){*(p+i)=1;}}void JosephusCircle::Josephus(){int i;int j=s;int leave=n;int order;cout<<"出圈顺序为:";while(leave!=0){if(j>n) j=j%n;for(i=0;i<m;i++){// cout<<j;order=j;if(p[j]!=0){ j++;while(p[j]==0){j++;if(j>n) j=1;}if(j>n){ j=1;while(p[j]==0){j++;if(j>n) j=1;}}}else{while(p[j]==0){j++;if(j>n) j=1;}}}cout<<' '<<order<<' ';p[order]=0;leave--;}}void main(){JosephusCircle Jose;Jose.input();Jose.Josephus();cout<<endl;}。