猴子选大王循环链表实现
- 格式:doc
- 大小:60.50 KB
- 文档页数:8
[题目]第1.1猴子选大王问题一:实验内容:M只猴子要选大王,选举办法如下:所有猴子按1,2……n编号围成一圈,从第一号开始顺序1,2……m,凡是报m号的退出圈外,如此循环报数直到圈内只剩一只猴子时这只猴子就是大王。
二:实验要求:利用单向循环链表模拟此过程,输出选出的大王编号。
三:程序的设计思想:(1)问题分析:“猴子选大王”问题是约瑟夫环问题的一个特例。
由于本题目的数据元素个数不可知,所以可使用链表来动态的分配内存空间。
而该问题又是一个不断的循环问题所以用循环链表来实现。
(2)总体设计:首先生成一个空链表,并给n个结点分配空间,让单链表的表尾指针指向头结点则生成一个带有n个结点的循环单链表。
再给每只猴子建立顺序的编号。
现从第一个结点开始报数,依次顺序查找出报数为m的待出列的结点(猴子)通过q->next=p->next删除该结点后继续运行否则让q成为p的前驱指针。
最后当p->next==p时停止运行,得到p所指向的结点即为猴子选出大王的编号。
四:提供测试结果:定义 n=8, m=3,测试结果如下:对猴子进行编号!1号猴子:12号猴子:23号猴子:34号猴子:45号猴子:56号猴子:67号猴子:78号猴子:82号猴子报:2 3号猴子报:3 3号猴被淘汰4号猴子报:1 5号猴子报:2 6号猴子报:3 6号猴被淘汰7号猴子报:1 8号猴子报:2 1号猴子报:3 1号猴被淘汰2号猴子报:1 4号猴子报:2 5号猴子报:3 5号猴被淘汰7号猴子报:1 8号猴子报:2 2号猴子报:3 2号猴被淘汰4号猴子报:1 7号猴子报:2 8号猴子报:3 8号猴被淘汰7号猴子报:24号猴子报:34号猴被淘汰7号猴子报:1胜出:7号猴子Press any key to continue五:程序源代码#include <stdio.h>#include <stdlib.h>#define n 8#define m 3typedef struct monkey{int num;struct monkey *next;} Monkey;int main(){Monkey *p,*head,*q;int i;head=p=q=malloc(sizeof(Monkey));//建立头指针 for(i=1;i<n;i++) //给n个结点分配空间{p=malloc(sizeof(Monkey));q=p;}q->next=head; //建立循环链表p=head;printf("对猴子进行编号!\n");for(i=1;i<=n;i++) //给n只猴子分别建立顺序编号{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) //报道m的猴子淘汰{i=0;printf("%d号猴被淘汰\n",p->num);q->next=p->next;continue;}else{if(i==m-1) q=p;p=p->next;}}printf("胜出:%d号猴子",p->num); }。
“约瑟夫”问题及若干变种例1、约瑟夫问题(Josephus)[问题描述]M只猴子要选大王,选举办法如下:所有猴子按1…M编号围坐一圈,从第1号开始按顺序1,2,…,N 报数,凡报到N的猴子退出到圈外,再从下一个猴子开始继续1~ N报数,如此循环,直到圈内只剩下一只猴子时,这只猴子就是大王。
M和N由键盘输入,1≤N,M≤10000,打印出最后剩下的那只猴子的编号。
例如,输入8 3,输出:7。
[问题分析1]这个例题是由古罗马著名史学家Josephus提出的问题演变而来的,所以通常称为Josephus(约瑟夫)问题。
在确定程序设计方法之前首先来考虑如何组织数据,由于要记录m只猴子的状态,可利用含m个元素的数组monkey来实现。
利用元素下标代表猴子的编号,元素的值表示猴子的状态,用monkey[k]=1表示第k只猴子仍在圈中,monkey[k]=0则表示第k只猴子已经出圈。
程序采用模拟选举过程的方法,设变量count表示计数器,开始报数前将count置为0,设变量current 表示当前报数的猴子编号,初始时也置为0,设变量out记录出圈猴子数,初始时也置为0。
每次报数都把monkey[current]的值加到count上,这样做的好处是直接避开了已出圈的猴子(因为它们对应的monkey[current]值为0),当count=n时,就对当前报数的猴子作出圈处理,即:monkey[current]:=0,count:=0,out:=out+1。
然后继续往下报数,直到圈中只剩一只猴子为止(即out=m-1)。
参考程序如下:program josephus1a {模拟法,用数组下标表示猴子的编号}const maxm=10000;var m,n,count,current,out,i:integer;monkey:array [1..maxm] of integer;beginwrite('Input m,n:');readln(m,n);for i:=1 to m do monkey[i]:=1;out:=0; count:=0; current:=0;while out<m-1 dobeginwhile count<n dobeginif current<m then current:=current+1 else current:=1;count:=count+monkey[current];end;monkey[current]:=0; out:=out+1; count:=0end;for i:=1 to m doif monkey[i]=1 then writeln('The monkey king is no.',i);readlnend.[运行结果]下划线表示输入Input m,n:8 3The monkey king is no.7 {时间:0秒}Input m,n:10000 1987The monkey king is no.8544 {时间:3秒}[反思]时间复杂度很大O(M*N),对于极限数据会超时。
第五章数组和广义表一、选择题1. 常对数组进行的两种基本操作是()(A)建立与删除(B)索引和修改(C)查找和修改(D)查找与索引参考答案:C2.二维数组M的元素是4个字符(每个字符占一个存储单元)组成的串,行下标i的范围从0到4,列下标j的范围从0到5,M按行存储时元素M[3][5]的起始地址与M按列存储时元素( ) 的起始地址相同。
(A)M[2][4](B)M[3][4](C)M[3][5](D)M[4][4]参考答案:B3.数组A[8][10]中,每个元素A的长度为3个字节,从首地址SA开始连续存放在存储器内,存放该数组至少需要的单元数是()。
(A)80(B)100(C)240(D)270参考答案:C4.数组A[8][10]中,每个元素A的长度为3个字节,从首地址SA开始连续存放在存储器内,该数组按行存放时,元素A[7][4]的起始地址为()。
(A)SA+141(B)SA+144(C)SA+222(D)SA+225参考答案:C5.数组A[8][10]中,每个元素A的长度为3个字节,从首地址SA开始连续存放在存储器内,该数组按列存放时,元素A[4][7]的起始地址为()。
(A)SA+141(B)SA+180(C)SA+222(D)SA+225参考答案:B6.稀疏矩阵一般的压缩存储方法有两种,即()。
(A)二维数组和三维数组(B)三元组和散列(C)三元组和十字链表(D)散列和十字链表参考答案:C7.若采用三元组压缩技术存储稀疏矩阵,只要把每个元素的行下标和列下标互换,就完成了对该矩阵的转置运算,这种观点()。
(A)正确(B)错误参考答案:B8.设矩阵A是一个对称矩阵,为了节省存储,将其下三角部分按行序存放在一维数组B[1,n(n-1)/2]中,对下三角部分中任一元素ai,j(i<=j),在一组数组B的下标位置k的值是()。
(A)i(i-1)/2+j-1(B)i(i-1)/2+j(C)i(i+1)/2+j-1 (D)i(i+1)/2+j参考答案:B二、填空题1.己知二维数组A[m][n]采用行序为主方式存储,每个元素占k个存储单元,并且第一个元素的存储地址是LOC(A[0][0]),则A[0][0]的地址是_____________________。
5.4.8 实验项目5-14:猴子选大王1、实验名称:猴子选大王2、实验目的:(1)熟练使用循环控制。
(2)熟练理解和掌握二维数组存储结构的使用技巧。
3、实验任务(1)实验内容:一群猴子要选新猴王。
新猴王的选择方法是:让n只候选猴子围成一圈,从某位置起顺序编号为1~n号。
从第1号开始报数(从1到3),凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。
如此不断循环,最后剩下的一只猴子就选为猴王。
请问是原来第几号猴子当选猴王?(2)实验要求:输入一个正整数n(n<=100),写一个程序来模拟这个过程,输出猴王的序号。
测试用例:4、实验要点分析(1)问题分析:用循环的方法模拟选猴王的过程。
一种简单的方法是对n只猴子用1~n 编号,编号存放在大小为n的一维整数数组中,若某编号的猴子要退出圈子,则把其编号改为-1。
若数组中只剩一个非-1的编号时,该编号的猴子就是大王。
开始时数组中的元素是从1到n的整数,表示都在“圈子”中,凡报到3的猴子退出圈子,即置为-1。
再依次查找下一只在“圈子”中的猴子,并重新开始报数。
这个过程进行n-1次,就只剩下一只编号不是-1的猴子了。
这种方法在寻找“下一个在圈子中的猴子”时可能会遇到很多“-1”而浪费时间。
另一种改进的方法是把n只猴子用0~n-1编号,数组的下标表示猴子的编号,数组元素的值表示相邻下一只在圈子中的猴子编号。
比如,n=5时,初始的数组M的内容如下表: 下标:0 1 2 3 4当2号猴子(报数轮到3)退出圈子时,1号猴子的下一只相邻猴子就是3号猴子了,实现时只需一个赋值M[1]=M[2](即原来2号猴子的下一只相邻猴子成了1号猴子的下一只相邻猴子)。
数组M的内容变成了下表:下标:0 1 2 3 4这样做的好处有两个,一是第i号猴子的下一只相邻猴子就是M[i],不需要用一个循环去找了;二是不用当心数组M下标的访问会越界。
(2)实现要点:1)循环控制结构。
湖南人文科技学院计算机系课程设计说明书课程名称: 数据结构课程代码:题目: 猴子选大王年级/专业/班: 06级计算机科学与技术专业一班学生姓名:学号:06408109 06408102 06408107 0640812206408103指导教师: 刘刚常开题时间: 2008 年 6 月16 日完成时间: 2008 年 6 月29 日目录摘要 (3)一、引言 (4)二、设计目的与任务 (4)三、设计方案 (5)1、总体设计 (5)2、详细设计 (8)3、程序清单 (14)4、程序调试与体会 (22)5、运行结果 (23)四、结论 (24)五、致谢 (24)六、参考文献 (25)摘要本文首先介绍顺序表和链表并作以比较,我们分别使用循环队列和循环链表来解决猴子选大王的问题,程序使用了C语言编写,有很少一部分函数是用C++编写的,有比较详细的中文注释并在VC++下调试运行通过。
整个程序使用中文界面,并有相应的提示信息,便于操作和程序运行。
关键词:循环队列;循环链表;存储结构AbstractThis paper details the difference of sequence list and linklist.We respectively use queue and circular queue and circular linked list to solve the seek elected king of the monkey problem . The procedure write with C language ,a very small part function is used by the C + +,and has chinese explanatory note.What’s more,it was debugged in VC++ debugger and run very well.The whole procedure,with Chinese interface and thecorresponding hints,is convenient to run and easy to be operated.Keywords : circular queue;circular linked list ;storage structure《数据结构》课程设计——猴子选大王一、引言数据结构是一门非常重要的基础学科,但是实验内容大都不能很好的和实际应用结合起来。
猴子选大王问题集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。
问怎样排法,才能使每次投入大海的都是非教徒。
*问题分析与算法设计约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。
这里给出一种实现方法。
题目中30个人围成一圈,因而启发我们用一个循环的链来表示。
可以使用结构数组来构成一个循环链。
结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在船上。
从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为0,表示该人已被扔下海了。
这样循环计数直到有15个人被扔下海为止。
[编辑本段]约瑟夫问题的一般形式:约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。
最后剩下1号。
假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。
C++代码示例:#include<iostream>usingnamespacestd;voidmain(){intn,m,a[101],k,i,j,num;//计数器是从1开始的,所以100个人用101cout<<"请输入参加游戏的玩家人数(不超过100人):";cin>>n;cout<<"----------------------------------------"<<endl;if(n>100){cout<<"玩家太多,请重新登陆此程序!"<<endl;return;}cout<<"输入游戏中要玩的数字:";cin>>m;cout<<"----------------------------------------"<<endl;for(i=1;i<=n;i++){a【i】=1;//注意百度百科里不让使用ASCII里的方括号,这里是中文字符集里的方括号,}j=0;k=0;for(i=1;i<=n+1;i++){if(a【i】==1){j=j+a【i】;if(j==m){j=0;a【i】=0;k++;}if(k==n){num=i;break;}}if(i==n+1)i=0;}cout<<"最后获胜的玩家是第"<<num<<"号玩家!"<<endl;cout<<"----------------------------------------"<<endl; }写完密码约瑟夫就想到原来看到约瑟夫问题的一个数学解法很巧妙很简单不过只能推出最后一个出列的人无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。
问怎样排法,才能使每次投入大海的都是非教徒。
*问题分析与算法设计约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。
这里给出一种实现方法。
题目中30个人围成一圈,因而启发我们用一个循环的链来表示。
可以使用结构数组来构成一个循环链。
结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在船上。
从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为0,表示该人已被扔下海了。
这样循环计数直到有15个人被扔下海为止。
[编辑本段] 约瑟夫问题的一般形式:约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。
最后剩下1号。
假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。
C++代码示例: #i n c l u d e<i o s t r e a m>u s i n g n a m e s p a c e s t d;v o i d m a i n()i n t n,m,a[101],k,i,j,n um; //计数器是从1开始的,所以100个人用101 c o u t<<"请输入参加游戏的玩家人数(不超过100人):";c i n>>n;c o u t<<"----------------------------------------"<<e nd l;i f(n>100){c o u t<<"玩家太多,请重新登陆此程序!"<<e nd l;r e t u r n;}c o u t<<"输入游戏中要玩的数字:";c i n>>m;c o u t<<"----------------------------------------"<<e nd l;f o r(i=1;i<=n;i++){ a【i】=1;//注意百度百科里不让使用ASCII里的方括号,这里是中文字符集里的方括号,}j=0;k=0;f o r(i=1;i<=n+1;i++){i f(a【i】==1){j=j+a【i】;i f(j==m)j=0;a【i】=0;k++;}i f(k==n){n u m=i;b r e a k;}}i f(i==n+1)i=0;}c o u t<<"最后获胜的玩家是第"<<n u m<<"号玩家!"<<e nd l;c o u t<<"----------------------------------------"<<e nd l;}写完密码约瑟夫就想到原来看到约瑟夫问题的一个数学解法很巧妙很简单不过只能推出最后一个出列的人无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。
引言概述:数据结构猴子选大王(二)是继第一部分后的深入探讨。
本文将详细介绍猴子选大王问题的背景和相关算法,探讨不同数据结构在解决该问题时的优劣,并提出一种性能更高的改进算法。
通过对本文的阅读,读者将对数据结构在解决复杂问题中的应用有更深入的理解。
正文内容:一、背景介绍1.1问题描述:数据结构猴子选大王问题是一个经典的计算机科学问题,它描述了一群猴子按一定规则进行选举的过程。
1.2算法原理:猴子选大王问题可以通过循环链表和递归两种方法进行解决,其中循环链表是最常用的解法。
1.3算法过程:通过将猴子按一定顺序编号,然后循环一个圈,每次淘汰某一编号的猴子,直到只剩下最后一只为止,即为大王。
二、循环链表算法2.1数据结构选择:循环链表是解决猴子选大王问题的主要数据结构。
其特点是每个节点都有一个指针指向下一个节点,且最后一个节点指向第一个节点。
2.2算法流程:在循环链表中,通过不断遍历并淘汰节点,最终得到最后剩下的节点作为大王。
2.3时间复杂度分析:循环链表算法的时间复杂度为O(mn),其中m是猴子的总数,n是每次淘汰的数量。
三、改进算法3.1基于队列的改进算法:针对循环链表算法中的时间复杂度较高的问题,可以考虑采用队列的数据结构进行改进。
3.2算法优化:通过将猴子的编号依次入队,然后每次从队首取出一个猴子,再将其编号入队尾,直到只剩下一只为止。
3.3时间复杂度分析:改进算法的时间复杂度为O(m),其中m 是猴子的总数。
四、数据结构选择4.1循环链表的优势:循环链表是解决猴子选大王问题的经典数据结构之一,具有结构简单、操作灵活等优点。
4.2队列的优势:队列是改进算法中的数据结构选择,具有先进先出、操作高效等特点。
4.3不同数据结构的比较:循环链表适用于猴子选大王问题的普遍情况,而队列作为改进算法可以在处理大规模数据时提高效率。
五、总结本文详细介绍了数据结构猴子选大王(二)的相关算法和背景,在对循环链表和基于队列的改进算法进行比较后,提出了一种性能更高的改进算法。
一、猴子选大王:(1)M只猴子要选大王,选举办法如下:所有猴子按1-M编号围坐一圈,从1号开始按顺序1,2,,,K报数,凡报到K的猴子退出到圈外,如此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王。
M和K由输入文件提供,要求在输出文件中打印出最后剩下的猴子的编号。
数据规模(M<=1000,K<=10)【输入文件】输入文件monkey.in 的第1 行,为两个正整数,用一个空格隔开:M K【输出文件】输出文件monkey.out 只有一个正整数,输出最后一个猴子的编号【输入样例】7 3【输出样例】4这就是顶顶有名的约瑟夫问题。
这是一个据说是由古罗马著名史学家Josephus提出的问题演变而来的。
称之为约瑟夫问题。
很多资料上对这一问题解释得过于繁杂,实现起来不好理解。
在这里介绍一下本人的一些想法以供大家参考。
这个题目其实就是一种编程的经验问题。
我们可以假设猴子就位的状态用1表示,把猴子离开的状态用0表示。
那么我们就可以用一个a[M]的数组来存放M个猴子是否就位的状态。
我们可以一边报数一边遍历该数组,每遇到第K个1时,就把当前位置的1变为0,表示当前位置的猴子已经出局了。
一直循环遍历到我们的状态数组只有一个1的时候,这个存放1的数组下标再加上1(因为数组下标是由0开始的,所以要加1)即为选出的大王的编号。
想法很简单,现在关键的问题是如何解决当报数到第M个猴子的时候如何使得下一个报数重新回到第1个猴子处,也就是如何使用一维数组来解决环型问题的求解技巧。
大家想一下当我们的猴子围成圈坐的时候,问题其实由简单的一维数组变成了首尾相接的环型数组,也就是我们数据结构中的环型队列。
假设p为当前数组某一元素的下标,对于一维数组来说,我们只要p++就可以移动到下一个元素的位置上。
那么当p=M时,如果我们直接使用p++的话,p的值就超出了a[M]数组的最大长度,我们想要的是p++之后等于0。
那么如何实现呢?解决环型数组循环遍历元素的方法:对于环型数组移动下标时,我们如果每次在p++之后再加上p=p%M的话就能解决先前遇到的越界的问题。
PHP实现的猴王算法(猴⼦选⼤王)⽰例本⽂实例讲述了PHP实现的猴王算法。
分享给⼤家供⼤家参考,具体如下:<?phpfunction getKingMokey($n, $m){$monkey[0] = 0;//将1-n只猴⼦顺序编号⼊数组中for($i= 1; $i<= $n; $i++){$monkey[$i] = $i;}$len = count($monkey);//循环遍历数组元素(猴⼦编号)for($i= 0; $i< $len; $i= $i){$num = 0;foreach($monkey as $key => $value){if($value == 0) continue;$num++;$values = $value;}//若只剩⼀只猴⼦则输出该猴⼦编号(数组元素值) 并退出循环if($num == 1){echo $values;exit;}//将第$i只猴⼦踢出队伍(相应数组位置元素值设为0)$monkey[$i] = 0;//打印该猴⼦位置echo $i."";//设置计数器for($j= 1; $j<= $m; $j++){//猴⼦编号加⼀,遍历下⼀只猴⼦$i++;//若该猴⼦未被踢出队伍,获取下⼀只猴⼦编号if($monkey[$i] > 0) continue;//若元素值为0,则猴⼦已被踢出队伍,进⽽循环取下⼀只猴⼦编号if($monkey[$i] == 0){//取下⼀只猴⼦编号for($k= $i; $k< $len; $k++){//值为0,编号加1if($monkey[$k] == 0) $i++;//否则,编号已取得,退出if($monkey[$k] > 0) break;}}//若编号⼤于猴⼦个数,则从第0只猴⼦开始遍历(数组指针归零)//步骤同上if($i == $len) $i = 0;//同上步骤,获取下⼀只猴⼦编号if($monkey[$i] == 0){for($k= $i; $k< $len; $k++){if($monkey[$k] == 0) $i++;if($monkey[$k] > 0) break;}}}}}//猴⼦个数$n = 10;//踢出队伍的编号间隔值$m = 3;//调⽤猴王获取函数getKingMokey($n, $m);>运⾏结果:036927185104⽤递归的算法$monkeys = array(1 , 2 , 3 , 4 , 5 , 6 , 7, 8 , 9 , 10); //monkey的编号$m = 4; //数到第⼏只的那只猴⼦被踢出去function killMonkey($monkeys , $m , $current = 0){$number = count($monkeys);$num = 1;if(count($monkeys) == 1){echo $monkeys[0]."成为猴王了";return;}else{while($num++ < $m){$current++ ;$current = $current%$number;}echo $monkeys[$current]."的猴⼦被踢掉了<br/>";array_splice($monkeys , $current , 1);killMonkey($monkeys , $m , $current);}}killMonkey($monkeys , $m);运⾏结果:4的猴⼦被踢掉了8的猴⼦被踢掉了2的猴⼦被踢掉了7的猴⼦被踢掉了3的猴⼦被踢掉了10的猴⼦被踢掉了9的猴⼦被踢掉了1的猴⼦被踢掉了6的猴⼦被踢掉了5成为猴王了更多关于PHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家PHP程序设计有所帮助。
Computer Knowledge and Technology 电脑知识与技术第7卷第33期(2011年11月)案例导入教学法在数据结构教学中的应用杨玫,李瑛,李祁(海军航空工程学院,山东烟台264001)摘要:数据结构课程教学难度大,特别是如何与C 语言等语言类课程的衔接问题尤为突出。
针对这一问题,提出案例导入教学法并将其应用于教学。
关键词:数据结构;案例导入法;C 语言中图分类号:G642文献标识码:A 文章编号:1009-3044(2011)33-8272-02Application of Case Introduction Teaching in Data StructureYANG Mei,LI Ying,LI Qi(Naval Aeronautical and Astronautical University,Yaitai 264001,China)Abstract:Data structure is difficult to teach and study,especially how to associate with language,such as C language.For this,Case Intro⁃duction Teaching is proposed and applied to actual teaching of data structure.Key words:data structure;case introduction teaching;C language数据结构是计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心课程,而且已成为其他理工专业的热门选修课。
数据结构内容广泛,涉及到众多知识点,而且逻辑性和抽象性都很强,理论和实践紧密结合,因此对学生而言不易学,对教师而言不好讲,具体表现如下:①预备知识不扎实。
学生对于C 语言中的数组、函数、结构、指针等技术理解不深刻,不能灵活掌握,编写相关代码有困难;②基本概念理解不透彻。
《守住第一次》观后感心得体会6月11日下午,在项目纪检委员杨水秀组织下,荒山绿化项目全体成员在项目部会议室观看了《守住第一次》警示教育片。
这部片子以独特的视角,详实的影像资料,真实展现了腐败分子发自内心的反省和痛悔,令人震惊,发人深省,这部影片让我有了深深的感悟。
陈毅同志说过:“手莫伸,伸手必被捉,党和人民在监督,万目睽睽难逃脱”。
有损于党和人民形象的事不去做,有损于国家和人民群众利益的“便宜”不去沾,坚固的思想防线就不会被突破,不正之风就无可乘之机。
《守住第一次》用大量活生生的案例证明,有些腐败分子并不是一走上仕途就贪得无厌的,是随着他们地位渐高,权力渐大,诱惑也相应增多了,加之他们放松了世界观的改造和自我欲望的节制,失去了对腐败的防御能力而被名利财色打败,落得个善始不善终的可悲下场。
他们中的多数人在“第一次”收受贿赂款物时,都有一种忐忑不安的感觉,思想斗争非常激烈:是收还是拒收?然而他们最终没有战胜“第一次”,在“第一次”面前就打了败仗。
在面对诱惑时,一定要守节持定,不要因一念之差而酿成终身之祸。
从我做起,廉洁自律,洁身自好。
虽然我们并不在官位,并没有所谓的实权,貌似没有贪污受贿的机会。
但实际上,从我做起,就是从小事做起,从不拿单位一纸一笔做起。
同时,要定期学习,提升自己的政治素养和专业内涵,不断的端正自己的人生观、世界观、价值观。
用优秀共产党员的事例和精神鼓舞自己,做好本职工作,共同把新疆公司建设的更加廉洁文明,和谐美丽!《数据结构》课程设计报告-运动会分数统计一元多项式迷宫求解文章编辑纸牌游戏等-精品文档1南京林业大学数据结构课程设计报告专业:计算机科学与技术课程名称:数据结构姓名:学号:090801126指导老师:时间: 2011年1月目录要点:一.具体内容(题目)(1)二.需求分析(功能要求)(2)三.概要设计(程序设计思想)(3)四.详细设计(源代码)(6)五.调试分析(运行结果显示及说明)(31)六.课设总结(34)具体内容:题目1: 运动会分数统计**任务:参加运动会有n个学校,学校编号为1……n。
C++n只猴子围成一圈,顺时针方向从1到n编号。
之后从1号开始没顺时针方向让猴子从1,2,...,m依次报数,凡是报到m的猴子,就让其出圈,取消候选资格。
然后不停地按顺时针方向逐一让报到m者出圈,是的剩下的一个就是猴王。
#include <iostream>using namespace std;struct monkey //结构声明{int num; //整型数,用于记录猴子号monkey *next; //monkey结构指针};monkey *head,*tail; //monkey结构指针,全局变量void creat(int nn) //被调用函数{ //函数体开始int i; //整型变量i,用于计数monkey *p,*q; //声明monkey结构指针p,qp=new monkey; //为p分配内存空间p->num=1; //初始化p结点num域为1p->next=NULL; //初始化p结点next域为空head=p; //链表头指针head赋值为pq=p; //q赋值为pfor(i=2;i<=nn;i=i+1) //利用循环结构构造链表{p=new monkey; //为p配内存空间p->num=i; //初始化p结点num域为i,表示猴子号q->next=p; //将p点加到链表尾部q=p; //让指向链表尾部结点p->next=NULL; //链表尾部指向空}tail=q; //链表尾tail->next=head; //链表尾部指向链表头,形成循环链表}//被调用函数select,mm表示结点删除间隔void select(int mm){ //函数体开始int x=0; //声明整型值x,并初始化为0monkey *p,*q; //声明指针变量p,qq=tail; //q赋值给tail,指向循环链表尾部do //直到型循环,用于循环删除指定间隔的结点{p=q->next; //p赋值给相邻的下一个结点x=x+1; //x加1if(x%mm==0) //x是否整除mm{cout<<"被删除的猴子号为"<<p->num<<"号\n";q->next=p->next; //删除此结点delete p; //释放空间p=NULL;}elseq=p; //q指向相邻的下一个结点p}while(q!=q->next); //剩余结点数不为1,则继续循环head=q; //head指向结点q,q为链表中剩余的一个结点} //函数体结束int main() //函数体开始{int n,m; //声明整型变量n,mhead=NULL; //初始化head为空cout<<"请输入猴子的个数\n"; //提示信息cin>>n; //输入待插入结点的数据cout<<"请输入间隔\n"; //提示信息cin>>m; //输入间隔creat(n); //调用函数creat建立循环链表select(m); //调用函数select,找出剩下的猴子cout<<"猴王是"<<head->num<<"号\n"; //输出猴王delete head; //删除循环中最后一个结点return 0;} //函数体结束c//实现目标:分别列出出列的猴子,然后得出最后的大王,(我认为没必要猴子数m要大于n!..所以没有这方面的提示~~)//问题分析:通过对“猴子选大王”问题的分析,由于本题目的数据元素的个数不可预知,所以使用链表。
链表是动态的,可以在需要的时候增长和减少其长度,而数组是在编译时分派内存的,事业其大小是不可改变的,而且会出现内存浪费的情况。
我认为单循环链表能较好,在建立循环链表时,因为链表的大小由输入决定,因此与匹配的结点数也是变化的,所以要进行动态内存分配。
//测试用例:m=10;n=4,最后求出成为猴王的猴子号:结果:大王是5号:(太搞笑了,大家都用这个用例,第五号可真幸运!~)//不健全的地方:1.没有对输入为字母,非正数(例如0)进行出错判断,结果大王会是第一号猴子。
(我觉得也可以不改啊~~没有“正常的”猴子,下一个真正的猴子当然是大王)2.如果正数但是非整数,输出为……(我没试过=——=!)//猴子选大王源代码:#include"stdio.h"//用双引比尖括号好的原因是可以在本环境外部查找这个头文件滴..#include"stdlib.h"typedef struct Node{int data;struct Node *next;}Node,*LinkList;void CreatLinkList(LinkList *L,int m)// 创建循环链表 m为猴子总数{Node *p, *q;int i; (*L) = (LinkList)malloc(sizeof(Node));if ((*L) == NULL)//这里是什么意思?{printf("Memory allocation failed,goodbye~~");exit(1);}p = (*L);p->data = 1;//为什么错误数据会返回“第一号猴子”的值?是这里初始化的么?(如果是可以换成0的说~)for (i = 2; i <= m; i++){q = (LinkList)malloc(sizeof(Node));if (q == NULL){printf("Mmory allocation failed,goodbye~~");exit(1);}q->data = i;p->next = q;p = q;}p->next =(*L);}void King(LinkList *L, int n, int m){Node *p, *q;int k;int j = 1; p = (*L);for (; m > 1; m--){k = 1;while (k != n){p = p->next;k++;}printf("第%d个出队列的是%d号猴子,\n", j++, p->data);p->data = p->next->data;q = p->next;p->next = p->next->next;free(q);}printf("最终结果:大王是第%d号猴子。
\n",p->data);}int main(void){int m, n;LinkList L; printf("请输入猴子总数m,和数到那个猴子出队n,(逗号隔开):");scanf("%d%d",&m,&n);//在这后面加判断、提示部分。
for循环判断.. CreatLinkList(&L, m);King(&L, n, m);sistem("pause");return 0;}题目描述:n 只猴子要选大王,选举方法如下:所有猴子按 1,2 ……… n 编号并按照顺序围成一圈,从第 k 个猴子起,由1开始报数,报到m 时,该猴子就跳出圈外,下一只猴子再次由1开始报数,如此循环,直到圈内剩下一只猴子时,这只猴子就是大王。
输入数据:猴子总数n ,起始报数的猴子编号k ,出局数字m 输出数据:猴子的出队序列和猴子大王的编号代码修改了一天才完成,第一次是用多个函数写的,但是发觉C 语言没有引用参数这个特性,使得形参指针不能被直接修改,必须靠返回值来修改才行,这样太麻烦了...于是第二次写的时候就没有使用函数,直接在main()里完成了循环链表的操作,感觉应该没什么问题,哪位大牛看出问题跟我说下,thx...1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 /*约瑟夫问题(猴子选大王)循环链表C 语言实现Slyar 2009.3.31*/#include <stdio.h>#include <stdlib.h>/* 定义链表节点类型 */typedef struct node{int data ;struct node *next ;}linklist ;int main ()19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 {int i , n , k , m , total ; linklist *head , *p , *s , *q ; /* 读入问题条件 */ printf ("请输入猴子的个数:"); scanf ("%d", &n ); printf ("请输入要从第几个猴子开始报数:"); scanf ("%d", &k ); printf ("请输入出局数字:"); scanf ("%d", &m ); /* 创建循环链表,头节点也存信息 */ head = (linklist *) malloc (sizeof (linklist )); p = head ;p ->data = 1;p ->next = p ;/* 初始化循环链表 */ for (i = 2; i <= n ; i ++) {s = (linklist *) malloc (sizeof (linklist )); s ->data = i ;s ->next = p ->next ; p ->next = s ; p = p ->next ; }/* 找到第 k 个节点 */ p = head ;for (i = 1; i < k ; i ++) {p = p ->next ; }/* 保存节点总数 */ total = n ;printf ("\n 出局序列为:"); q = head ;/* 只剩一个节点时停止循环 */ while (total != 1) {/* 报数过程,p 指向要删除的节点 */ for (i = 1; i < m ; i ++) {p = p ->next ; }/* 打印要删除的节点序号 */ printf ("[%d] ", p ->data );63646566676869707172737475767778798081828384/* q 指向p 节点的前驱*/while(q->next != p){q = q->next;}/* 删除p 节点*/q->next = p->next;/* 保存被删除节点指针*/s = p;/* p 指向被删除节点的后继*/p = p->next;/* 释放被删除的节点*/free(s);/* 节点个数减一*/total--;}/* 打印最后剩下的节点序号*/printf("\n\n猴子大王为第[%d] 号\n\n", p->data); free(p);//system("pause");return0;}实验二#include<iostream.h>#include<conio.h>#include<stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW 0typedef int Status;typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;void CreatList_L(LinkList &L,int n){L=(LinkList)malloc(sizeof(LNode));L->next=NULL;int i; LinkList q,p;q=L;for(i=n;i>0;--i){p=(LinkList)malloc(sizeof(LNode));cin>>p->data;q->next=p;p->next=NULL;q=p;}}//尾插法void output(LinkList &L){ LinkList p;p=L->next;while(p){cout<<p->data;p=p->next;}}//输出函数Status ListInsert_L(LinkList &L,int i,int e){ LinkList p,s;int j;p=L;j=0;while(p&&j<i-1){p=p->next;++j;}if(!p||j>i-1)return ERROR;s=(LinkList)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;return OK;}void main(){LinkList L;CreatList_L(L,4);output(L);ListInsert_L(L,2,5);output(L);}void CreatList_L(LinkList &L,int n){L=(LinkList)malloc(sizeof(LNode));L->next=NULL;int i; LinkList p;for(i=n;i>0;--i){p=(LinkList)malloc(sizeof(LNode));cin>>p->data;p->next=L->next;L->next=p;}}//头插法。