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

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

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构课程设计报告(约瑟夫问题)

问题描述 约瑟夫问题:编号为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为计数器,指针每移动一次,k的值加一,当k=m时,此时p1指向人出列,p2指向该结点的上一结点,让上一结点的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成员赋值。 调试过程 输入过程中由于输入法的原因出现很多输入符号无法被编译器识别,导致出现很多错误。 当一轮报数结束时,让该结点的人出列后,忘记释放改结点,导致程序无法继续执行,重新加入free函数后,释放清空的结点,使程序能正确执行 要注意c语言中的输入输出的格式 约瑟夫问题并不是十分的复杂,调试过程并不是十分的繁琐 测试过程 测试数据一 总人数4 初始报数值2 四个人分别得key为2 2 2 2 出列顺序为2 4 3 1 测试数据二 总人数9 初始报数值6 九个人的key分别为 3 4 5 3 4 5 3 4 5 出列顺序为6 2 7 1 5 4 3 8 9 经验和体会 数据结构的这次课程设计是十分有意义的,让我巩固了这学期对数据结构这么学科的学习,自己在解决问题的同时,学会了怎样去思考和怎样去摸索,享受了编程过程中的快乐和成功后的喜悦。此次解决的是约瑟夫问题,并不是十分的复杂,但需要有足够的细心和全方面的考虑,通过设计数据的保存和数据的出列检验了对链表的掌握程度,如果对基础知识掌握不好,是无法成功写出程序的。 在编写和调试过程中要有足够的耐心,有特殊到全面,保证程序的各项性能完好,也许你会迷茫,你会不知道错误在哪里,但只要不放弃,最终总能完成程序的编写,并尝到最终的喜悦。 全部源代码 #include stdafx.h #include stdio.h #include stdlib.h #include string.h typedef struct node { int data; int num; struct node *next; } listnode; typedef listnode *linklist; void main() { int n,m,i,j,k; linklist head=(listnode*)malloc(sizeof(listnode));//开辟一个空间,将其起始地址赋给头指针head listnode *p1,*p2; printf(******请输入总人数:); scanf(%d,n);//输入总人数 printf(请输入初始报数值:); scanf(%d,m);//输入初始报数值 if (m=0) { printf

文档评论(0)

a888118a + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档