算法方案与分析实验指导书

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

在任意时刻,老鼠在迷宫中的位置可以用所在点的行下标与列下标

相关文档
最新文档