王振第一次试验报告猴子选大王.docx
- 文档编号:10108406
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:17
- 大小:61.29KB
王振第一次试验报告猴子选大王.docx
《王振第一次试验报告猴子选大王.docx》由会员分享,可在线阅读,更多相关《王振第一次试验报告猴子选大王.docx(17页珍藏版)》请在冰豆网上搜索。
王振第一次试验报告猴子选大王
数据结构第一次实验报告
题目:
猴子选大王
09计算机科学与技术一班王振(0982053)
题目描述:
有n只猴子,编号为1,2,3,……n,现在要在这N只猴子中选出一个大王。
让这N只猴子围成一圈坐下,从编号为1的猴子为起始点开始数一个数,数到的猴子便离开这个选大王的队列。
一直重复这个过程,直到最后剩下一只猴子便是选出的大王。
猴子的数量和数的数字M均由键盘输入。
实验内容和步骤:
第一部分:
顺序表方法
现在让N只猴子按照顺序围成一圈,可以用指针指向数组的方法给数组赋值,其中要求输入的数字M小于猴子的数量N。
从1开始数到m的猴子出列,即用指针移动查找法将计数器数到m的指针指向的内容变为0,用for循环,直到只有一个元素不为0时,最后不为0的元素的值即为大王。
第一步建立数组,填入猴子编号及猴子出局时报的数
第二步从第一个猴子报数
第三步数到m让指针指向元素变为0
第四步继续报数,重复第三步
在数组中依次填入1,2,3,4,…
ptr=(int*)calloc(n,sizeof(int));
Initialize(n,ptr);
FindKing_pointer(m,n,ptr);
free(ptr);
return0;
循环一次指针向后移一位,所指元素不为0时计数器加1.移动指针,当计数器数到m时将指针所指元素设为0.代码如下:
voidInitialize(intn,int*ptr)
{
inti;
for(i=0;i ptr[i]=i+1; } 终止循环,直到输出到最终元素不为0的元素即为选出的大王,输出大王的编号, 代码如下: if(ptr2==ptr+n) ptr2=ptr; /*指针所指元素不为0时计数器加1.*/ if(*ptr2! =0) i++; /*计数器数到m时将指针所指元素设为0*/ if(i==m) { *ptr2=i=0; count--;//用于终止循环 } } /*最后不为0的元素的值即为大王的编号*/ for(ptr2=ptr;;ptr2++) { if(*ptr2! =0) { printf("第%d个猴子是大王\n",*ptr2); break; } } 数据记录和分析 以下是程序调试界面: 输入猴子数为100报数为50 输出“第95个猴子是大王”,程序结束。 以下是其他数据调试结果列表 序列号 输入的猴子数量M 输入的报数数字N 输出结果 是否正确 001 80 40 19 是 002 98 35 13 是 003 125 67 81 是 004 56 36 4 是 005 37 26 13 是 006 84 29 72 是 007 23 11 4 是 …… …… …… …… …… 源程序 #include #include voidFindKing_pointer(int,int,int*);//移动指针法找大王 voidInitialize(int,int*);//初始化数组 intmain() { intm,n,*ptr; printf("输入猴子数与出局时报的数\n"); scanf("%d%d",&n,&m); while(n { printf(“输入数据有误,请重新输入! \n”); printf("输入猴子数与出局时报的数\n"); scanf("%d%d",&n,&m); } ptr=(int*)calloc(n,sizeof(int)); Initialize(n,ptr); FindKing_pointer(m,n,ptr); free(ptr); return0; }/*在数组中依次填入1,2,3,4,…*/ voidInitialize(intn,int*ptr) { inti; for(i=0;i ptr[i]=i+1; } /*循环一次指针向后移一位,所指元素不为0时计数器加1.移动指针,当计数器数到m时将指针所指元素设为0.*/ voidFindKing_pointer(intm,intn,int*ptr) { inti,count,*ptr2; count=n-1;//count=0时终止循环 ptr2=ptr;//移动ptr2进行查找 //calloc()为指针类型的元素分配内存时,元素被初始化为空指针 for(i=0;count! =0;ptr2++) { if(ptr2==ptr+n) ptr2=ptr; /*指针所指元素不为0时计数器加1.*/ if(*ptr2! =0) i++; /*计数器数到m时将指针所指元素设为0*/ if(i==m) { *ptr2=i=0; count--;//用于终止循环 } } /*最后不为0的元素的值即为大王的编号*/ for(ptr2=ptr;;ptr2++) { if(*ptr2! =0) { printf("第%d个猴子是大王\n",*ptr2); break; } } } 第二部分: 单链表方法 从控制台读取猴子的数量和报数的最大数——>对猴子进行编号,并用链表来存储——>让链表中的猴子进行报数,对于报数为m的猴子则从链表中删除——>当链表中只剩下一个报数后则停止这个过程,这最后一个猴子即选出来的大王。 以下为为猴子建立链表: for(i=1;i { p=(LINK)malloc(sizeof(Monkey)); p2->next=p; p2=p; } (//输入猴子的数量,从键盘输入数字。 ) 以下为猴子进行编号: for(i=1;i<=n;i++)//对猴子进行编号 { p->num=i; //printf("%d号猴子: %d\n",p->num,p->num); p=p->next; } 以下为最主要的算法过程,是通过一个While循环来控制的,是让猴子报数的过程,并删除报数为m的猴子: while (1) { i++; //当链表只剩最后一个元素了则跳出循环,此时报数已完成 printf("%d号猴子报: %d\n",p->num,i);if(p->next==p)break; if(i==m) { i=0; printf("%d号猴被淘汰\n",p->num); printf("\n"); p2->next=p->next; p=p2->next; continue; } else { if(i==m-1)p2=p; p=p->next; } } 数据记录和分析 输入N=100,输入M=50 通过链表循环实现。 输出结果: 第95号猴子是选出的大王,下是其他数据调试结果列表 序列号 输入的猴子数量M 输入的报数数字N 输出结果 是否正确 001 80 40 19 是 002 98 35 13 是 003 125 67 81 是 004 56 36 4 是 005 37 26 13 是 006 84 29 72 是 007 23 11 4 是 …… …… …… …… …… 源程序: #include #include intn=2; intm=1; typedefstructmonkey { intnum; structmonkey*next; }Monkey,*LINK; voidmain() { printf("请输入一个整数(猴子数量): "); scanf("%d",&n); printf("请输入一个小于猴子数量的整数(报数的最大数): "); scanf("%d",&m); LINKp,head,p2; inti; head=p=p2=(LINK)malloc(sizeof(Monkey)); for(i=1;i { p=(LINK)malloc(sizeof(Monkey)); p2->next=p; p2=p; } p2->next=head; p=head; //printf("对猴子进行编号! \n"); for(i=1;i<=n;i++)//对猴子进行编号 { p->num=i; //printf("%d号猴子: %d\n",p->num,p->num); p=p->next; } i=0; p=head; while (1) { i++; //当链表只剩最后一个元素了则跳出循环,此时报数已完成 printf("%d号猴子报: %d\n",p->num,i);if(p->next==p)break; if(i==m) { i=0; printf("%d号猴被淘汰\n",p->num); printf("\n"); p2->next=p->next; p=p2->next; continue; } else { if(i==m-1)p2=p; p=p->next; } } printf("选出的大王是: %d",p->num); } 实验总结 通过这第一次的程序设计,从中意识到实际操作独立完成实验课程设计的重要性。 在实验的初期感觉到对程序很陌生,不知道从哪里下手,在之后对于课本以及其他的书籍和网络渐渐的了解关于《猴子选大王》方面的链表边写方法解析,从中了解了关于链表方法的应用。 继而通过课本知识渐渐扩充了顺序表的方法。 顺序表方法是从其他的程序设计渐渐看明白的并根据其中的一些解决问题的方法应用于《猴子选大王》的。 虽然在边写过程中遇到了种种不顺,但是最终还是通过查阅各种资料以及通过网络资源的参考最终完成了两种方法对于实现《猴子选大王》课题的设计工作,并最终完成了调试。 这次的课程设计是我的第一个关于《数据结构》中C语言的设计课题,以后也会有更多的关于这方面的设计题。 通过这次的初次尝试并最终完成使我总结了许多关于程序设计的经验。 程序是通过每一个细节程序段结合起来实现整体的运行,单纯的通过一次性的从头写到尾是很难实现的,但是不排除特别优秀的人对于程序的熟悉程度很高。 对于我们初次接触来说是基本靠一步步的程序段写出来并实现程序运行正常并且运行正确无误。 一个程序是通过许多个程序段的多次调试无误后结合在一起的,而不是整体编写完后再运行的,这样产生的一个好处就是避免整体写完之后发现程序运行错误但是找不到在哪里出现错误。 每一个程序段的代码运行无误后再一起结合运行可以良好的实现整个程序编写的效率,避免不必要的麻烦。 附录 附上单链表赋值方法: 数据位字符串的单链表操作的例子 #include #include #define null 0 typedef struct node{ char *data;//结点的数据域,为一个字符串 struct node *next;//结点的指针域 }linkstrnode;//定义单链表结点结构 typedef linkstrnode *linkstring; main(){//建立数据域为字符串类型,且结点无重复的单链表。 对单链表做删除结点操作 linkstring head; char *t; printf("\nplease input the node of the linklist: "); printf("\nnodes data is strings,and end of #\n"); creatlinkstr(&head);//建立单链表 printf("\nthe source linklist is : \n"); printing(head);//输出单链表 printf("\nplease input search string: "); gets(t);//输入要删除的字符串 deletet(&head,t);//在单链表head中找到并删除值与t相同的结点 printf("\nthe final linklist is: \n"); printing(head);//输出做了删除操作后的单链表 } creatlinkstr(linkstring head){ //建立单链表 char *t; linkstrnode *p; head=(linkstrnode *)malloc(sizeof(linkstrnode)); //建立一个只含头结点的空链表,头指针为head head->next=null; printf("\nplease input the node data(string),end of #"); gets(t);//输入一个字符串t while (strcmp(t,"#")! =0){//当t的值不为“#”时,做以下操作 p=head;//在建好的单链表中,以p为扫描指针,从头开始查找有无数据域与t相同的结点 while ((p->next)&&(strcmp(t,p->next->data))) p=p->next; if (p->next)//如果存在数据域与t相同的结点,则输出存在信息 printf("\nstring %s existed",t); else{//若不存在数据域与t相同结点,则做以下操作 p->next=(linkstrnode *)malloc(sizeof(linkstrnode)); //在单链表表尾申请一个新结点 p=p->next;//p指针指向新的表尾结点 strcpy(p->data,t);//将t的值复制到*p结点的数据域中 p->next=null;//将单链表的表尾结点的next指针置为空 } printf("\nplease input the node data(string),end of #"); gets(t);//输入下一个字符串 }//end of while }//end of creatlinkstr printing(linkstring head){ //输出head单链表 linkstrnode *p; p=head->next; while(p){ puts(p->data);//输出结点的数据——字符串 p=p->next; } }//end of printing deletet(linkstring head,char *t){ //若head单链表中有数据为t的结点,删除之 linkstrnode *p,*s; p=head; while ((p->next)&&(strcmp(p->next->data,t))) //以p为扫描指针对head链表进行查找数据域值为*t结点, //为了能方便删除操作,p指向待查结点的前趋 p=p->next; if (p->next){//若查找到有,则做删除操作 s=p->next; p->next=s->next; free(s); printf("\ndelete successful! "); } else//若head链表中没有数据域的值为*t的结点,则输出删除失败的信息 printf("\ndelete failure! "); } 参考文献 参考书籍 《数据结构(C语言版)》严蔚敏吴伟民编著清华大学出版社2010.10 《数据结构与算法》刘灿勋编著2007.3 《C程序设计(第三版)》谭浩强编著2009.10 参考资源网站 “网学”网 软件技术精品专业网站 考研论坛
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第一次 试验报告 猴子 大王