选猴王 数据结构课程设计.docx

上传人:b****6 文档编号:5946136 上传时间:2023-01-02 格式:DOCX 页数:8 大小:72.40KB
下载 相关 举报
选猴王 数据结构课程设计.docx_第1页
第1页 / 共8页
选猴王 数据结构课程设计.docx_第2页
第2页 / 共8页
选猴王 数据结构课程设计.docx_第3页
第3页 / 共8页
选猴王 数据结构课程设计.docx_第4页
第4页 / 共8页
选猴王 数据结构课程设计.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

选猴王 数据结构课程设计.docx

《选猴王 数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《选猴王 数据结构课程设计.docx(8页珍藏版)》请在冰豆网上搜索。

选猴王 数据结构课程设计.docx

选猴王数据结构课程设计

 

计科专业数据结构A课程设计

选猴王

作者姓名:

王显衡

专业、班级:

计科123

学号:

12422003

指导教师:

赵晶

完成日期:

2013年11月17日

 

大连大学

DalianUniversity

 

目录

题目描述1

1、算法思想2

2、详细设计2

4调试分析4

5用户使用说明5

6课程设计总结6

参考文献7

题目描述

任务:

一堆猴子都有编号,编号是1,2,3...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。

  要求:

  输入数据:

输入m,nm,n为整数,n

  输出形式:

中文提示按照m个猴子,数n个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能

1、算法思想

将表中最后一个结点的指针域指向头结点,整个链表形成一个环,构造循环链表‘*L’。

由此,从表中任意一个结点开始,都可以遍历全表。

再用一个for循环来实现从第1开始数,第数到第N个,该猴子就要离开此圈。

如果链表不空的话,用’a’指向开始结点,往后数到第N个结点,就把第N-1个结点与第N+1个结点链在一起,即实现了删除第N个结点。

如此反复,直到L的后继结点是它自己,即圈中只剩最后一只猴子,那么这只猴子就是大王。

2、详细设计

1)、猴子的存放采用链式存储结构,利用循环链表来实现建立的,其表示方法是递归定义的:

typedefstructMnode

{intdata;

structMnode*next;

}Mnode;

根据题目要求,要让这M只猴子顺序围坐一圈,那就得用循环链表,只须将单循环链表的尾指针的NEXT域指向头指针。

它的判空条件是L=L->next=NULL;

 

(非空表)(空表)

单循环链表

2)、函数voidhzxdw(M,N)读取数据M、N后,然后就根据N的值,用for循环数猴子结点用’a’指向开始结点,往后数到第N个结点,就把第N-1个结点与第N+1个结点链在一起,即实现了删除第N个结点。

如此反复,直到L的后继结点是它自己,即圈中只剩最后一只猴王。

其源代码如下:

voidhzxdw(intm,intn)//猴子选大王

{

Mnode*q,*p,*L,*pre;

inti;

//s作为n的标志

for(i=0;i

{

if(i==0)

{

p=(Mnode*)malloc(sizeof(Mnode));

if(!

p)

{

printf("存储空间分配失败!

\n");

exit(0);

}

p->data=i+1;

L=p;

p->next=L;

}

else

{

q=(Mnode*)malloc(sizeof(Mnode));

q->data=i+1;

q->next=L;

p->next=q;

p=q;

}

}

p=L;//从第一个猴子开始报数

while(p!

=p->next)//当p=p->next时表明猴子大王已选出

{

for(i=1;i<=n;i++)

{

if(i==n)

{

q=p;

pre->next=p->next;

p=p->next;

free(q);

}

else

{

pre=p;

p=p->next;

}

}

}

printf("选出的猴王是%d号猴子\n",p->data);

}

本算法只用了两个简单的for循环,所以时间复杂度为O(N+MN-M)。

其中难点是如何实现数到第N就删除它。

4调试分析

程序运行截图如下:

5用户使用说明

用户根据提示输入两个整数,分别代表猴子M总数和报数N。

6课程设计总结

要提高自己的编程能力,你必须亲自去体验、去设计、编辑、编译、调试、运行。

在此之前,我也以为自己对C语言已经比较懂了,可还是遇到了一系列问题,也学到很多东西。

每一个人都是在失败、尝试、失败、尝试与收获中成长起来的。

我本学识尚浅,无权谈论这些,只是希望能对大家有所警醒,编程之道漫漫无边,吾将上下而求索.当你看着自己把功能一个个实现,把错误一个调试出来,那种感觉给了自己某种安慰,还有自信!

让自己对语言有了更深一层的了解!

参考文献

[1]严蔚敏,吴伟民.数据结构(C语言版)。

清华大学出版社,1997.4

 

附录一***程序代码

#include

#include

typedefstructMnode

{

intdata;

structMnode*next;

}Mnode;

voidhzxdw(intm,intn)//猴子选大王

{

Mnode*q,*p,*L,*pre;

inti;

//s作为n的标志

for(i=0;i

{

if(i==0)

{

p=(Mnode*)malloc(sizeof(Mnode));

if(!

p)

{

printf("存储空间分配失败!

\n");

exit(0);

}

p->data=i+1;

L=p;

p->next=L;

}

else

{

q=(Mnode*)malloc(sizeof(Mnode));

q->data=i+1;

q->next=L;

p->next=q;

p=q;

}

}//为猴子编号

p=L;

while(p!

=p->next)//当p=p->next时表明猴子大王已选到

{

for(i=1;i<=n;i++)

{

if(i==n)

{

q=p;

pre->next=p->next;

p=p->next;

free(q);//q->data号猴子出列

}

else

{

pre=p;

p=p->next;

}

}

}

printf("选出的猴王是%d号猴子\n",p->data);

}

intmain()

{

intm,n;

printf("请输入猴子总数m和规定猴子报数n的值(当n或m等于0时程序结束):

\n");

while(scanf("%d%d",&m,&n)&&m&&n)

{

hzxdw(m,n);

printf("请输入猴子总数m和规定猴子报数n的值(当n或m等于0时程序结束):

\n");

}

return0;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 笔试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1