算法方案与分析实验指导书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计与分析
实
验
指
导
书
信息科学技术学院
目录
实验一常见简单算法的设计、实现与分析
[实验目的]
1.掌握单链表的建立插入及删除的算法;
2.进一步熟悉指针的用法;
[预习要求]
1.认真阅读教材或参考书, 掌握线性表算法的基本思想;
2.写出求解本实验的程序;
3.设计好相应的测试用例。
[类型定义]
typedef struct Lnode
{int data。
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。i<=n。++i>
{p=(link>malloc(sizeof(node>>。
scanf("%d",&p->data>。
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个结点,被删结点通过 e返回}
[实验步骤]
1.先用插表头或插表尾的方法建立单链表并输出,并测试你的程序,直至正确为止;
2.再进行插入和删除程序的设计;
3.将你的程序和实录的界面存盘备用。
[实验报告要求]
1.阐述实验目的和实验内容;
2.提交模块化的实验程序源代码;
3.简述程序的测试过程,提交实录的输入、输出文件;
4.提交思考与练习题的代码和测试结果。
[思考与练习]
怎样用链表实现循环队列。
实验二多项式加法
[实验目的]
1.熟练掌握在单链表中进行结点的插入和删除操作;
2.进一步熟悉指针的用法;
[预习要求]
1.认真阅读教材或参考书, 掌握线性表算法的基本思想;
2.写出求解本实验的程序;
3.设计好相应的测试用例。
[类型定义]
typedef struct Lnode
{int 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。i<=n。++i>
{p=(link>malloc(sizeof(node>>。
scanf("%d%d",&p->coef,&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=p->next。
}
}
void addlist(linklist *A, linklist B>
{//将A和B相加并通过A返回}
[实验步骤]
1.先用插表尾的方法建立一元多项式,并将一元多项式输出,并测试你的程序,直至正确为止;
2.进行一元多项式相加程序的设计;
3.将你的程序和实录的界面存盘备用。
[实验报告要求]
1.阐述实验目的和实验内容;
2.提交模块化的实验程序源代码;
3.简述程序的测试过程,提交实录的输入、输出文件;
4.提交思考与练习题的代码和测试结果。
[思考与练习]
写出约瑟夫问题的求解算法,即n个人坐成一圈,报m出圈,输出最后一个报m的人。
实验三集合的表示与操作算法设计
[实验目的]
1.了解集合的不同表示方法,掌握集合的树结构表示方法。
2.掌握树结构表示下集合的并运算与查找算法。
3.编程实现集合的表示与操作算法.
[预习要求]
1.认真阅读教材内容, 熟悉树结构表示的原理和操作算法。
2.设计和编制实验程序.
[参考数据类型或变量]
typedef ElemType int /* 实型或任意其它元素类型 */
typedef struct {
ElemType elem。
int tag。 /* 根节点为负的整数,表示该集合的基数的负值,否则为父节点索引指针 */
}NODE。
NODE *set。 /* 用动态存储分配实现集合的树表示与存储 */
[参考子程序接口与功能描述]
void InitSet(NODE *set>
功能: 根据集合的基数动态分配存储, 输入各元素, 初始化子集森林.
int Find(NODE *set, ElemType elem>
功能: 在数组set中顺序查找元素elem,如果不成功, 返回-1。否则,使用带压缩规则的查找算法,返回所在子集的根节点索引.
int Union(NODE *set, ElemType elem1, ElemType elem2>
功能: 应用Find算法首先找到elem1和elem2所在的子集, 然后应用带加权规则的并运算算法合并两个子集. 不成功时, 返回-1。否则, 返回并集的根节点索引.
[实验步骤]
1.设计Find的测试方案和程序,输入测试数据,修改并调试程序,直至正确为止。
2.设计Union的测试方案和程序,输入测试数据,修改并调试程序,直至正确为止。
3.待各功能子程序调试完毕,去掉测试程序,将你的程序整理成功能模块存盘备用.
[实验报告要求]
1.阐述实验目的和实验内容。
2.提交实验程序的功能模块。
3.记录最终测试数据和测试结果。
[思考题]
试用C语言实现集合的位向量表示, 并设计相应的并、交与查找运算算法.
实验四迷宫问题求解
[实验目的]
1.熟悉栈用法;
2.掌握回朔法及试探法的程序设计;
[预习要求]
1.认真阅读教材或参考书, 掌握栈用法的用法;
2.写出求解本实验的程序;
3.设计好相应的测试用例。
[实验提示]
设迷宫中数组的元素为1表示该点道路主的阻塞,为0表示可通。
设maze[1][1]为入口,maze[m][n] 为出口。
在maze[1][1]和maze[m][n]的元素值必为0。
在任意时刻,老鼠在迷宫中的位置可以用所在点的行下标与列下标