算法设计与分析实验指导.doc
《算法设计与分析实验指导.doc》由会员分享,可在线阅读,更多相关《算法设计与分析实验指导.doc(48页珍藏版)》请在沃文网上搜索。
1、算法设计与分析实验指导书目 录实验一 单链表的建立插入及删除3实验二 多项式加法5实验三 集合的表示与操作算法设计7实验四 迷宫问题求解8实验五 树的建立及遍历11实验六 图的遍历的演示12实验七 哈希表的设计15实验八 Kruskal算法的设计17实验九 归并排序的分治策略设计19实验十 哈夫曼编码的贪心算法设计21实验十一 递归与迭代程序设计22实验十二 多段图问题的动态规划算法设计24实验十三 作业调度问题26实验十四 回溯算法设计28实验十五 搜索顺序的选择29实验十六 蛇和梯子31实验十七 游戏中寻址算法的设计34实验十八 旅行商问题36实验十九 骑士游历算法设计38实验二十 输油管
2、道问题的设计与实现40实验二十一 邮局选址问题的设计与实现42实验二十二 会场安排问题的设计与实现44实验二十三 目录树打印程序的设计46实验二十四 最少演员问题48附:实验(设计)报告参考格式50实验一 单链表的建立插入及删除实验目的1掌握单链表的建立插入及删除的算法;2进一步熟悉指针的用法; 预习要求1.认真阅读教材或参考书, 掌握线性表算法的基本思想;2.写出求解本实验的程序;3.设计好相应的测试用例。类型定义typedef struct Lnodeint data;struct Lnode *next;Lnode,*linklist;实验提示void create(link *h,in
3、t n)/创建单链表link p,q;int i;p=(link)malloc(sizeof(node);p-next=null;*h=p;q=p;for(i=1;idata);p-next=null;q-next=p;q=p;void print(link h)/输出单链表link p;p=h-next;while(p)printf(%d ,p-data);p=p-next;void insertlist(linklist *L,int i,int e)/在单链表的第i个元素之前插入元素值为e的结点void dellist(linklist *L,int i,int *e)/删除单链表的第i
4、个结点,被删结点通过 e返回实验步骤1. 先用插表头或插表尾的方法建立单链表并输出,并测试你的程序,直至正确为止;2. 再进行插入和删除程序的设计;3. 将你的程序和实录的界面存盘备用。 实验报告要求1. 阐述实验目的和实验内容;2. 提交模块化的实验程序源代码;3. 简述程序的测试过程,提交实录的输入、输出文件;4. 提交思考与练习题的代码和测试结果。思考与练习怎样用链表实现循环队列。实验二 多项式加法实验目的1熟练掌握在单链表中进行结点的插入和删除操作;2进一步熟悉指针的用法; 预习要求1.认真阅读教材或参考书, 掌握线性表算法的基本思想;2.写出求解本实验的程序;3.设计好相应的测试用例
5、。类型定义typedef struct Lnodeint coef,exp;struct Lnode *next;Lnode,*linklist;实验提示void create(link *h,int n)/创建一元多项式link p,q;int i;p=(link)malloc(sizeof(node);p-next=null;*h=p;q=p;for(i=1;icoef,&p-exp);p-next=null;q-next=p;q=p;void print(link h)/输出单链表link p;p=h-next;while(p)printf(%d,%d ,p-coef,p-exp);p=
6、p-next;void addlist(linklist *A, linklist B)/将A和B相加并通过A返回实验步骤1 先用插表尾的方法建立一元多项式,并将一元多项式输出,并测试你的程序,直至正确为止;2 进行一元多项式相加程序的设计;3 将你的程序和实录的界面存盘备用。 实验报告要求1 阐述实验目的和实验内容;2 提交模块化的实验程序源代码;3 简述程序的测试过程,提交实录的输入、输出文件;4提交思考与练习题的代码和测试结果。思考与练习写出约瑟夫问题的求解算法,即n个人坐成一圈,报m出圈,输出最后一个报m的人。实验三 集合的表示与操作算法设计实验目的. 了解集合的不同表示方法,掌握集合
7、的树结构表示方法;. 掌握树结构表示下集合的并运算与查找算法;. 编程实现集合的表示与操作算法.预习要求1. 认真阅读教材内容, 熟悉树结构表示的原理和操作算法;2. 设计和编制实验程序.参考数据类型或变量typedef ElemType int /* 实型或任意其它元素类型 */typedef struct ElemType elem; int tag; /* 根节点为负的整数,表示该集合的基数的负值,否则为父节点索引指针 */NODE;NODE *set; /* 用动态存储分配实现集合的树表示与存储 */参考子程序接口与功能描述void InitSet(NODE *set)功能: 根据集合
8、的基数动态分配存储, 输入各元素, 初始化子集森林.int Find(NODE *set, ElemType elem)功能: 在数组set中顺序查找元素elem,如果不成功, 返回-1; 否则,使用带压缩规则的查找算法,返回所在子集的根节点索引. int Union(NODE *set, ElemType elem1, ElemType elem2)功能: 应用Find算法首先找到elem1和elem2所在的子集, 然后应用带加权规则的并运算算法合并两个子集. 不成功时, 返回-1; 否则, 返回并集的根节点索引.实验步骤. 设计Find的测试方案和程序,输入测试数据,修改并调试程序,直至正
9、确为止;. 设计Union的测试方案和程序,输入测试数据,修改并调试程序,直至正确为止;. 待各功能子程序调试完毕,去掉测试程序,将你的程序整理成功能模块存盘备用.实验报告要求. 阐述实验目的和实验内容;. 提交实验程序的功能模块;. 记录最终测试数据和测试结果。思考题试用C语言实现集合的位向量表示, 并设计相应的并、交与查找运算算法.实验四 迷宫问题求解实验目的1熟悉栈用法;2掌握回朔法及试探法的程序设计; 预习要求1.认真阅读教材或参考书, 掌握栈用法的用法;2.写出求解本实验的程序;3.设计好相应的测试用例。实验提示设迷宫中数组的元素为1表示该点道路主的阻塞,为0表示可通。设maze11
10、为入口,mazemn 为出口。在maze11和mazemn的元素值必为0。在任意时刻,老鼠在迷宫中的位置可以用所在点的行下标与列下标(i,j)来表示,这样,老鼠在迷宫中的某点mazeij时,其可能的运动方向有八个。下图+表示某时刻老鼠所在的位置(i,j),相邻的八个位置分别标以N、NE、E、SE、S、SW、W、NW(分别代表+点的北、东北、东、东南、南、西南、西、西北方向);同时,相对于(i,j),这八个相邻位置的坐标的值都可以计算出来。但是,并非迷宫中的每一个点都有八个方向可走,四个角上就只有三个方向可供选择,边上只有五个方向可供选择。为了不在算法中每次都去检查这些边界条件,在迷宫外面套上一
11、圈,其元素值均为1。 NW(I-1,J-1) N(I-1,J) NE(I-1,J+1) W(I,J-1)+(I,J)E(I,J+1)SW(I+1,J-1) S(I+1,J) SE(I+1,J+1)为了简化算法,根据上图所示的位置(i,j)与其相邻的八个位置的坐标关系,建立一个下图所示的表move,表中给出相对于位置(I,j)的八个方向上的i与j的增量值。Move -10-110111101-10-1-1-1 若老鼠在(i,j)位置,要进入SW方向(g,h)点,则由该增量值表来修改坐标。 g=i+move50; h=j+move51;例如:若(i,j)为(3,4),则SW的相邻点的坐标为(3+1
12、,4-1)。在每个位置上都从N方向试起,若不通,则顺时针方向试NE方向,其余类推。当选定一个可通的方向后,要把目前所在的位置以及所选的方向记录下来,以便往下走时可依次一点一点退回来,每退一步后接着试在该点未试过的方向。为了避免走回到已经进入过的点,mazeij=2.为了记录当前位置以及该位置上所选择的方向数需设一个堆栈。#define m 6#defing n 9void path()int mazem+2n+2 ; int move82; int s543; int top=0;int i,j,k,pf=0;for(i=0;im+2;+i)for(j=0;jn+2;+j)scanf(“%d”
13、,&mazeij);maze11=2; stop0=1; stop1=1;stop2=0;+top;while (top!=0&f=0)-top;i= stop0; j= stop1;k= stop2; while(k8) g=i+movek0; h=j+movek1; if (g=m&h=n&mazegh=0) for(p=0;pm=n; for(j=0;jdataj.firstadj=NULL; g-dataj.vex=j; for(j=0;jadjvex=k; p-next=NULL;if(g-datai.firstadj=NULL)g-datai.firstadj=p;else q=g
14、-datai.firstadj;while(q-next)q=q-next;q-next=p;/* 向图的深度优先遍历*/void dfs(adjlist g, int v )node *p; printf(%3d,v); visitedv=1; p= g.datav.firstadj; while(p)if(visitedp-adjvex=0) dfs(g , p-adjvex); p=p-next; /*图的广度优先遍历程序*/*void bfs(adjlist g, int v )*/*定义空队列*/*int Q100;int front=0,rear=0;node *p;visited
15、v=1;printf(%3d,v);Qrear+=v;while(front!=rear)v=Qfront+; p= g.datav.firstadj; while(p) if(visitedp-adjvex=0) visitedp-adjvex=1; printf(%3d, p-adjvex); Qrear+= p-adjvex; p=p-next; */void print(adjlist g)int i; node *p; for(i=0;iadjvex); p=p-next; printf(n); 实验步骤1先建立图的邻接表,并将邻接表输出,并测试你的程序,直至正确为止;3 进行深度优
16、先遍历和广度优先遍历;4 将你的程序和实录的界面存盘备用。 实验报告要求1 阐述实验目的和实验内容;2 提交模块化的实验程序源代码;3 简述程序的测试过程,提交实录的输入、输出文件;4提交思考与练习题的代码和测试结果。思考与练习写出图的邻接矩阵表示法的定义,并实现求最短路径的算法。实验七 哈希表的设计实验目的1掌握的哈希表定义和存储2掌握查找常用方法及过程3实现哈希表的综合操作 预习要求1认真阅读和掌握本实验的算法。2上机将本算法实现。3保存和打印出程序的运行结果,并结合程序进行分析。类型定义#define MAXSIZE 12 /哈希表的最大容量,与所采用的哈希函数有关enum BOOLFa
17、lse,True;enum HAVEORNOTNULLKEY,HAVEKEY,DELKEY; /哈希表元素的三种状态,没有记录、有记录、有过记录但已被删除typedef struct /定义哈希表的结构int elemMAXSIZE; /数据元素体HAVEORNOT elemflagMAXSIZE; /元素状态标志,没有记录、有记录、有过记录但已被删除int count; /哈希表中当前元素的个数 HashTable;typedef structint keynum; /记录的数据域,只有关键字一项Record;实验提示void InitialHash(HashTable &H)/哈希表初始化
18、void PrintHash(HashTable H)/显示哈希表所有元素及其所在位置BOOL SearchHash(HashTable H,int k,int &p)/在开放定址哈希表H中查找关键字为k的数据元素,若查找成功,以p指示/待查数据元素在表中的位置,并返回True;否则,以p指示插入位置,并/返回FalseBOOL InsertHash(HashTable &H,Record e)/查找不成功时插入元素e到开放定址哈希表H中,并返回True,否则返回FalseBOOL DeleteHash(HashTable &H,Record e)/在查找成功时删除待删元素e,并返回True,
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 实验 指导
