当前位置:文档之家› 数据结构 猴子选大王

数据结构 猴子选大王


出为大王的猴子是几号 ,建立一个函数来实现此功能。
【算法设计】
通过对“猴子选大王”问题的分析,由于本题目的数据 元素的个数不可预知,所以使用链表。链表是动态的,可以 在需要的时候增长和减少其长度,而数组是在编译时分派内 存的,事业其大小是不可改变的,而且会出现内存浪费的情 况。我认为单循环链表能较好,在建立循环链表时,因为链 表的大小由输入决定,因此与匹配的结点数也是变化的,所 以要进行动态内存分配。
{ cout<<"第几个猴子离开?"<<endl; cin>>c; if(c>i) cout<<"输入数量大于猴子数量,请重新输入"<<endl; if(c<i||c==i) flag=1;
} k=King(head,c,i);//调用猴子选大王函数 cout<<"大王编号为 "<<k<<endl; }
通过本次实习,温固了数据结构的相关知识,加深对课内 所学的有关数据的逻辑结构和存储表示、数据结构的选择和应 用、算法的设计和时空效率分析等课程基本内容的理解,进一 步熟悉了VC++编程环境,巩固并提高了分析问题、解决实际问 题的能力。 做任何一件事情都需要一个过程,在这个过程中,面对许多问
题,我们尽最大的努力寻找解决方法,现学现用新的知识,不 断积累经验,为未来的发展打下基础。我们是在学习,但是我 们真正要学的是学习的能力,我们享受这个过程,因为它引领 我们进步
注意:输入数据为整型,切勿输入整形以外数据类型, 否则程序将报错。
#include <stdio.h>为包含的库函数 Linklist Create(int n)// 创建循环链表 n为猴子总数 int King(Linklist head,int n,int i)//选出大王来
【源代码】
#include <iostream> #include <stdlib.h> using namespace std; typedef struct node {
int i; p=head; p->next=NULL; for(i=1;i<=n;i++) {//将猴子顺序编号
q=(ListNode *)malloc(sizeof(ListNode)); q->data=i; p->next=q; p=q; p->next=NULL; } return head;//返回链表头指针 }
【完成题目1】猴子选大王 【问题描述】
一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m
个)按照1--m的顺序围坐一圈,从第1开始数,每数到第N个,
该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一
只猴子,则该猴子为大王。
【基本要求】
输入数据:输入m,n。 m,n 为整数,n<m;
输出形式:中文提示按照m个猴子,数n 个数的方法,输
for(j=0;j<n;j++) {//数到第n个猴子
pp=p; p=p->next; if(!p) p=head->next; } if(!p->next) t=head;//当删除的结点为最后一个结点时,t指向头结 点 else t=pp; Delete(p,pp); p=t; i--; } k=pp->data;//将最后一只猴子的编号赋值给k return k;//返回最后一只猴子编号 }
【结果截图】
【收获及体会】
猴子选大王是一个数据结构很古兴趣。
在课程设计中,首先要看清问题,将问题要求理解透彻, 在构思要如何实现,要用到哪些函数,要用什么算法,在课程 构思中选算法是一个很重要的概念,只有确定用这么算法后才 能接下来的工作,将流程图画在纸上,再依次编写代码,在程 序设计中,编写代码只是一个方面,调试才是关键。它是一个 相当繁琐的过程,有许多新的问题需要被解决,但同时它也是 一个比较重要的过程。
/****************打印链表***************/ void printlist(Linklist head) {
p=head->next; while(p) {//打印链表直至链表结尾
cout<<p->data<<" "; p=p->next; } }
/**************删除被选到的猴子*****************/ void Delete(ListNode *b,ListNode *pb) /*pb为删除结点的前驱*/ {
int data; struct node *next;//定义结点指针 }ListNode;
typedef ListNode *Linklist;//自定义链表类型/Malloc 向系统申请分配指定 size个字节的内存空间 ListNode *q,*p; Linklist head=(Linklist)malloc(sizeof(ListNode));//申请头结点 /*******按将猴子数量编号并存入链表*******/ Linklist Create(int n) {
void main() {
int i,c,k,flag=0;//falg:整型变量,与int相似 cout<<"请输入猴子数量"<<endl; cin>>i; cout<<"--------------将猴子顺序编号--------------"<<endl; printlist(Create(i));//调用将猴子顺序编号的函数 cout<<endl<<"-----------------编号结束-----------------"<<endl; while(!flag)
pb->next=b->next; free(b);
}
/**************猴子选大王(数n个)**************/ int King(Linklist head,int n,int i) {
int j,k; ListNode *pp,*t; /*删除节点前驱*/ p=head; if(i==1) return i; while(i!=1) {
相关主题