1、2、课程设计的任务4三、设计方案与实施(小三号、黑体、加粗)41、总体设计42、详细设计63、程序清单74、程序调试与体会95、运行结果(截图)10四、结 论11五、致 谢12六、参考文献121、设计的目的与要求:132、设计进度及完成情况13摘 要线性链表是一种重要而且使用广泛的数据结构,用链表所表示数据元素之间的逻辑关系是由节点中的指针指示的,而循环链表的特点是表种最后一个节点的指针指向头结点,整个链表形成一个环,用循环链表作为本课题的数据存储结构,充分考虑了循环链表的特点仅通过对两个循环链表的出、入列操作,大大降低空间复杂度就简单的实现了要求,动态地模拟出了猴子选大王问题中猴子循环报数的
2、情况。关键词:数据结构 线性链表 存储结构 空间复杂度(35个)Abstract Linear list is an important and extensive use of the data structure,List said that the data used by the logic of relations between the elements by the node in the direction of the pointer,The circulation list of the characteristics of the species list is the
3、last node of the indicators point to the first node, the entire list to form a ring,With the cycle of the list as the subject of data storage structures, taking into account the full cycle through the list of the characteristics of only two out of circulation list, out into operation, greatly reduce
4、 the complexity of space on the realization of a simple request,To simulate the dynamics of the monkey king election issue in a number of monkeys circulation SituationKey words: Data Structure, Linear List, Storage structure,Space complexity数据结构课程设计 -猴子选大王问题设计一、引 言数据结构是一门专业技术基础课,它对学习者的的要求很明确:学会分析、研究
5、计算机加工的数据结构的特性,以便为应用设计所需的数据选择适当的逻辑结构、存储结构及其相应的算法,并初步掌握算法的时间分析和空间分析的技术。其次,该课程的学习过程也是复杂程序设计的训练过程,要求学习者编写的程序结构或设计的程序结构体清楚、正确、易读,符合软件工程的规范。循环链表是一种重要的链式结构,其特殊性在于需附设两个指针分别指示表头元素及表尾元素的位置且表头和表尾相邻接,臆造的环状空间巧妙的解决了需循环依次删除元素的约瑟夫问题。本设计采用目前最通用的程序设计语言之一C语言作为数据结构和算法的描述语言,循环链表作为数据存储结构。 充分考虑了循环链表的特点仅通过对两个循环链表的出、入列操作,就简
6、单的实现了要求,动态的模拟出了猴子选大王问题中猴子循环报数的情况。该程序通俗易懂且实用性强,其他类似的算法均可借鉴和参考使用。并且该程序清单详细具体、全面、具有很强的可读性。 二、设计目的与任务1、课程设计的目的1) 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;训练学生灵活应用所学数据结构的基本知识,熟练的完成问题分析、算2) 法设计、编写程序,求解出指定的问题;3) 训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养严谨的科学态度和良好的工作作风;4) 提高综合运用所学的理论知识和方法独立分析和解决问题的能力
7、。2、课程设计的任务问题描述:一堆猴子都有编号,编号是1,2,3 .m ,这群猴子(m个)按照1到m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。课题要求:输入数据m,n 其中m,n 为整数,n输出形式为提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号三、设计方案与实施1、总体设计/写总体的设计思想采用两个循环队列反复出队列与入队列来进行“舞伴配对”。程序中主要用到以下抽象数据类型:1) 设定链表抽象数据类型的定义ADT struct 对象数据(整数) 操作对象:struct monkey *create()
8、 建立链表 struct monkey *findout(start,n) 找出被淘汰的猴子的上一个 Struct monkey *letout(last) 删掉被淘汰的猴子,返回的指针值指向下一个猴子。基本操作(1) initring(int n,linklist r) 操作结果:构造一个具有n个元素的循环链表r。(2) iinklist delete(int n,int k,linklist r)初始条件:链表r已存在。循环依次删除问题对应所需位置的元素并当即输出其值,用指针r记录其最后元素的位置。ATD linklist(3) outring(int n,linklist r)特殊输出链
9、表保留的最后一个元素,即猴子大王的序号。程序包含两个模块(1) 主程序模块,其中主函数为int main输入信息;根据输入要求进行删除和输出;输出结果;(2) 循环链表模块实现具体删除输出操作。2) 两模块之间的简单调用关系主函数模块循环队列模块循环链表模块图1 模块调用图2、详细设计/对几个主要功能函数作出相应的说明1) 各个函数之间的调用关系主函数最后元素输出操作链表循环删除输出操作数据输入输出序号图2 函数调用关系图2) 函数设计程序设计中主要包括下列函数LinkList initring(int n,linklist r) 构造一个含n个元素的循环链表;LinkList delete(
10、int n,int k,linklist r) 循环删除报k号的元素; 循环输出所删除的元素;记录链表最后所保留的元素的位置;void outring(int n,linklist r) 输出链表最后保留的元素,即猴子大王的序号;3、程序清单/整个程序的运行清单#include stdio.h #include stdlib.h typedef struct node int data; struct node *next; listnode,*linklist; linklist initring(int n,linklist r) /创建一个循环单链表 linklist p,q; int
11、i; r=q=(listnode *)malloc(sizeof(listnode); /两个指针指向首位置 for(i=1;idata=i;next=p; q=p; p-data=n;next=r; /头尾相连 r=p; /指向头节点位置 return r; linklist deleted(int n,int k,linklist r) int i,j;p=r; /p移至头节点位置=n-1;i+) /循环n-1次,即只需删除n-1个节点,最后剩下猴子大王 for(j=1;jnext; /p循环移至下一个位置 q=p-next=q- /报k号的猴子出列,即删除p-next printf(%4
12、d,q-data); if(i % 6=0) printf(n); free(q);return r; /记录猴子大王位置并传递 void outring(int n,linklist r) linklist p; p=r; /获得猴子大王位置 猴子大王:%4dn,p-void main() /主函数 linklist r; int n,k; linklist initring(int n,linklist r); linklist deleted(int n,int k,linklist r); void outring(int n,linklist r);printf(请输入猴子总数 monkey number= scanf(%d,&n);请输入将出列猴子的报数号:k);下列序号的猴子因报%d号而依次出列:,k); r=initring(n,r); r=deleted(n,k,r); outring(n,r); 4、程序调试与体会通过这次课程设计,我们受益颇多:首先,上课时请的理论知识,似乎很容易接受,以及各种算法都能够比较轻松的理解,但是在真正的运用过程中,并
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1