首页 考试资料幻灯片工程技术公务员考试小学教学中学教学大学教学外语资料
数据结构实验书


}/*第二次隔1个洞找,第三次隔2个洞找,以后如此类推,经过一千次 printf("n 兔子可能藏在如下的洞中:") ; for(i=0;i<LIST_INIT_SIZE;i++) if((*L).elem[i]==1) printf(" return OK; } void main(){ n 此洞是第%d 号洞 ",i+1);/*输出未进过的洞号

*/

SqList L; InitList_Sq(&L); Rabbit(&L); } 【测试数据】 最后的输出结果为:2 【说明】 本算法思路比较简单,采用了顺序表表示围着山顶的 10 个洞,首先对所有洞设置标志为 1,然后通过 1000 次循环,对每次所进之洞修改标志为 0,最后输出标志为 1 的洞。 【实验题】 1. 同上面的狐狸逮兔子问题, 如果山上有 5 个洞或 20 个洞, 狐狸从早到晚进进出出了 500 次或 10000 次, 仍没有找到兔子。问兔子究竟可能藏在哪个洞里? 2. 同上面的问题,将表示洞的线性表采用单链表实现,并比较其差异。 4 7 9

第三节 约瑟夫问题的实现

【问题描述】 设有 n 个人围坐在圆桌周围,现从某个位置 m(1≤m≤n)上的人开始报数,报数到 k 的人就站出来。下一 个人,即原来的第 k+1 个位置上的人,又从 1 开始报数,再报数到 k 的人站出来。依此重复下去,直到全 部的人都站出来为止。试设计一个程序求出出列序列。 这是一个使用循环链表的经典问题。因为要不断地出列,采用链表的存储形式能更好地模拟出列 的情况。 【数据描述】 我们可以建立一个不带头结点的循环链表,其中的 n 个人用 n 个结点来表示。 Typedef int Elemtype;

Typedef struct Cnode { Elemtype data; struct }CNode; Cnode *next;

【算法描述】见图 2.5 的流程图。

Status {

Create_clist(Clist

&clist,int

n)

clist=null; for(i=n;i>=1;i--) { if(!(p=(CNode *)malloc(sizeof(CNode)))) return p->data=i; p->next=clist; clist=p; if(i==n) q=p;//用 q 指向链表的最后一个结点 overflow; //存储分配失败

} q->next=clist;//把链表的最后一个结点的链域指向链表的第一个结点,构成循环链表 ok; }//end status { Joseph(int return m,int n,int k) ERROR;//起始位置错

if(m>n)

if(!Create_clist(clist,n)) return p=clist; for(i=1;i<m;i++) p=p->next;//p 指向 m 位置的结点 while(p) { for(i=1;i<k-1;i++) p=p->next;//找出第 k 个结点 q=p->next; printf(“%d”,q->data);//输出应出列的结点 if(p->next==p) p=null;//删除最后一个结点 ERROR;//循环链表创建失败

else

{ p->next=q->next;//删除第 K 个结点 p=p->next;//使 P 指向第 k+1 个元素位置 free(q); }

}

//while

clist=null; } //end

【C 源程序】 #include #include <stdio.h> <stdlib.h>

#define NULL 0 #define OK 1 #define ERROR 0

#define OVERFLOW -2 typedef int typedef int Status; Elemtype;/*定义数据元素类型 */

typedef struct Cnode { Elemtype data; struct }CNode; CNode *joseph;/*定义一个全局变量 Status { Create_clist(CNode *p,*q; */ n) Cnode *next;

*clist,int

CNode

int i; clist=NULL; for(i=n;i>=1;i--) { p=(CNode *)malloc(sizeof(CNode));

if(p==NULL) return p->data=i; p->next=clist; OVERFLOW; /*存储分配失败 */

clist=p; if(i==n) q=p;/*用 q 指向链表的最后一个结点 } q->next=clist; joseph=clist; return } Status { int Joseph(CNode i; OK; /*end */ n,int k) /*把链表的最后一个结点的链域指向链表的第一个结点,构成循环链表 /*把创建好的循环链表头指针赋给全局变量 */ */ */

*clist,int m,int

CNode *p,*q; if(m>n) return ERROR;/*起始位置错 if(!Create_clist(clist,n)) return ERROR; /*循环链表创建失败 */ */ */

p=joseph; /*p 指向创建好的循环链表 for(i=1;i<m;i++) p=p->next; /*p 指向 m 位置的结点 while(p) { for(i=1;i<k-1;i++) p=p->next; /* q=p->next; printf("%d

*/

找出第 k 个结点

*/

",q->data);/*输出应出列的结点

*/

if(p->next==p) p=NULL; /*删除最后一个结点 else */

{ p->next=q->next; p=p->next;

free(q);

} } /*while */

clist=NULL; } /* end */

void { int

main( ) m,n,k,i;

CNode *clist; clist=NULL;/*初始化 clist */

printf("n 请输入围坐在圆桌周围的人数 n:"); scanf("%d",&n); printf("n 请输入第一次开始报数人的位置 m:"); scanf("%d",&m); printf("n 你希望报数到第几个数的人出列?"); scanf("%d",&k); Create_clist(clist,n);/*创建一个有 n 个结点的循环链表 clist printf("n 出列的顺序如下:n"); Joseph(clist,m,n,k); getch(); }/*main */ */

【测试数据】 1、请输入围坐在圆桌周围的人数 n:7 请输入第一次开始报数人的位置 m:3 你希望报数到第几个数的人出列? 出列的顺序如下:4 6 1 3 2 2

7 5

2、请输入围坐在圆桌周围的人数 n:13 请输入第一次开始报数人的位置 m:5 你希望报数到第几个数的人出列? 出列的顺序如下:10 3 9 4 6 12 7 5 2 6 11 8 1 13

3、请输入围坐在圆桌周围的人数 n:21 请输入第一次开始报数人的位置 m:3 你希望报数到第几个数的人出列? 出 11 20 8 18 7 19 10 列 2 15 9 的 9 4 1 21 3 顺 序 13 如 5 16 17 下 :

6 14 12

【说明】 本算法采用一个不带表头的循环链表来处理约瑟夫问题,在此算法中,每次找出需出列结点,要经过 k 次 循环移动定位指针,全部结点出列,需经过 n 个 k 次循环,因此,本算法的时间复杂度为 O(k*n)。实际 问题的处理中,有许多与约瑟夫问题类似,都可以采用此方法完成。 【实验题】 1. 处理约瑟夫问题也可用数组完成,请读者自己编写使用数组实现约瑟夫问题的算法和程序。 2. 猴王问题。某森林中有 n 只猴子在商量猴王选举问题,所有的猴子都想当猴王,因此大家商量了一个选 举办法如下:所有的猴子围成一圈,先从第一个猴子开始报数,报数到 13 的猴子就出列。紧接着的下一个 猴子,又从 1 开始进行新的一轮报数,报数到 12 的猴子再出列;依此重复下去,每一轮报数都比上一轮的 报数少 1,直到报数减为 1 之后,又从 13 开始报数。直到原列中只剩下一个猴子为止,这个猴子就是猴王。 试设计一个程序求出猴王。

123456789101112131415161718192021222324252627282930

 


 

  【Top

最新搜索

 

数据结构实验指导书 - 数据结构 实验指导书 院别 专业 班级 姓名 计算机学院编 实验一 线性表的顺序存储实验 一、实验目的及要求 1、掌握在TC环境下调试顺序表...

数据结构与算法实验指导书90969 - 数据结构与算法实验指导书 计算机与信息学院 实验一 【实验目的】 顺序表 熟练掌握线性表在顺序存储结构上的基本操作。 【实验...

数据结构实验指导书02 很好!很好!隐藏&gt;&gt; 实验二 2.1 实验目的: 线性表 (1)掌握线性表的顺序存储结构的定义及 C 语言实现。 (2)掌握线性表在顺序存储结构即...

数据结构实验说明书新版 - the principl e of simplified E IA of constr uction pr oject s in the regi on. In te...

数据结构实验指导书 - 数据结构实验指导(C语言版)... 数据结构实验指导书_IT/计算机_专业资料。数据结构实验指导(C语言版) 数据结构实验指导书 江西农业大学计算机与...

数据结构试验指导书V2[1].0 - V 2.0 数据结构与算法 实验指导书 编写: 编写:陆绍飞 校核: 校核:___ 湖南大学软件学院 2011 年 9 月 湖南大学软件学...

数据结构实验指导书(2012.9) - 1.2 实验报告(文档)书写规范 实验报告(文档)应包括以下 7 个方面的内容: 1、问题分析 根据对实验任务的理解, 以无歧义的陈述...

09级《数据结构》实验指导书 - 《数据结构实验指导书》 潘向辉/吴学毅编写 印包学院数字媒体技术专业 2011 年 3 月 实验说明 实验说明 【实验环境】 操作系统:...

空间数据结构基础实验指导书 隐藏&gt;&gt; 《空间数据结构基础》 课程实习指导书实习周数:2 周 学分数:2 一、实习目的 数据结构是一门重要的专业基础课,其特点是理论...

《数据结构(C 语言版) 》实验指导书(非计算机专业适用) 广州大学 2013.1 目 录 实验一 线性表的顺序存储及其操作... 1 实验二 线性表的链式存储及其操作......


 

热点推荐