第一篇:二叉树的创建与访问算法设计
内蒙古工业大学信息工程学院
实 验 报 告
课程名称: 数据结构(C语言版)实验名称: 二叉树的创建与访问算法设计 实验类型: 验证性□ 综合性□ 设计性□ 实验室名称: c机房 班级:xxxxxxxxx 学号: xxxxxxxxxxxxxxx 姓名: xxx 组别: 同组人:
成绩:
实验日期: 2011年 6月
内蒙古工业大学信息工程学院
预习报告成绩: 指导教师审核(签名): 2011年 月 日
预习报告
一.实验目的
本实验以二叉树的创建与访问算法设计作为实验内容,掌握树型结构的实现方法,培养解决负责问题的能力。
二.实验内容
1、编写生成二叉树的函数,二叉树的元素从键盘输入;
2、编写在二叉树中插入元素的函数;
3、编写在二叉树中删除元素的函数;
4、编写遍历并输出二叉树的函数。
方案一采用递归算法实现二叉树遍历算法。方案二采用非递归算法实现二叉树遍历算法。三.实验要求
1、掌握树型结构的机器内表示;
2、掌握树型结构之上的算法设计与实现;
3、列表对比分析两种数据结构的相应操作的时间复杂度、空间复杂度,阐明产生差异的原因。四.问题描述
从键盘输入二叉树的元素,建立二叉树,实现二叉树的遍历算法。
五.基本要求
实现以下基本操作:
(1)从键盘输入二叉树的元素,建立二叉树。(2)实现二叉树的先序遍历算法。
内蒙古工业大学信息工程学院
实验报告成绩: 指导教师审核(签名): 2011年 月 日
实验报告
一 程序清单
#include “stdio.h” #include “string.h” #include
typedef struct BiTNode{ char data;
struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;
BiTree Create(BiTree T){
char ch;
ch=getchar();if(ch=='#')T=NULL;else{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))printf(“Error!”);T->data=ch;
T->lchild=Create(T->lchild);T->rchild=Create(T->rchild);}
return T;}
int Depth(BiTree T){
int dep=0,depl,depr;if(!T)dep=0;else {
depl=Depth(T->lchild);depr=Depth(T->rchild);
dep=1+(depl>depr?depl:depr);}
return dep;}
void main(){ BiTree T;int dep;printf(“请输入您要创建的二叉树!!n
'#'表示空元素!n”);T=Create(T);
printf(“nn您要求的二叉树的深度:”);dep=Depth(T);
printf(“%dnn”,dep);} }
内蒙古工业大学信息工程学院
二 测试结果
三 调试程序出现的问题及解决的方法
编程中出现很多的编译错误,主要采用对每个函数调试,设断点,运用自己的程序中,让我更好的掌握了递归算法。四 实验心得体会
通过这次试验,让我巩固了链式存储结构和递归算法的使用,用模块化思路设计程序,编写程序要小心谨慎,要细化到每个函数,通过多次调试,才使得整个程序正确运行,达到预期结果。
第二篇:实验一线性表的创建与访问算法设计
内蒙古工业大学信息工程学院
四、编译程序:
#include
typedef char ElemType;typedef struct LNode
//定义单链表结点类型 {
ElemType data;
struct LNode *next;}LinkList;
LinkList *CreatlinkR(LinkList *L)
//用尾插法建立带头结点的单链表 {
LinkList *s, *r;char ch;r =(LinkList *)malloc(sizeof(LinkList));
//创建头结点
L = r;s = r;r->next = NULL;printf(“单链表元素值为单个字符, 连续输入,$为结束字符:”);while((ch = getchar())!= '$'){
r =(LinkList *)malloc(sizeof(LinkList));
//创建新结点
r->data = ch;
r->next = NULL;
s->next = r;
s = r;
} r->next=NULL;
//终端结点
return(L);}
void Sort(LinkList *h)
//单链表元素排序 { LinkList *p=h->next,*q,*t;
if(p!=NULL){
t=p->next;
p->next=NULL;
p=t;
while(p!=NULL)
{
t=p->next;
q=h;
第 页
内蒙古工业大学信息工程学院
while(q->next!=NULL&&q->next->data
data)
q=q->next;
//在有序表中找插入*p的前驱结点*q
p->next=q->next;
//将*p插到*q之后
q->next=p;
p=t;
} } }
void DispList(LinkList *L)
//输出单链表L {
LinkList *p=L->next;
while(p!=NULL){
printf(“%c ”,p->data);
p=p->next;} }
LinkList *Union(LinkList *La,LinkList *Lb,LinkList *Lc)
{ LinkList *pa=La->next,*pb=Lb->next,*s,*tc;
Lc=(LinkList *)malloc(sizeof(LinkList));
tc=Lc;while(pa!=NULL&&pb!=NULL){
if(pa->data
data)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
tc->next=s;
tc=s;
pa=pa->next;
}
else if(pa->data>pb->data)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pb->data;
tc->next=s;
tc=s;
pb=pb->next;
}
else
{
第 页
//求两有序集合的并集 //复制结点
内蒙古工业大学信息工程学院
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
tc->next=s;
tc=s;
pa=pa->next;
//重复元素只复制一个
pb=pb->next;
} } if(pb!=NULL)
//复制余下结点
pa=pb;while(pa!=NULL){
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
tc->next=s;
tc=s;
pa=pa->next;
} tc->next=NULL;return(Lc);}
LinkList *InsterSect(LinkList *La,LinkList *Lb,LinkList *Lc)
//求两有序集合的交集 {
LinkList *pa=La->next,*pb,*s,*tc;
Lc=(LinkList *)malloc(sizeof(LinkList));
tc=Lc;
while(pa!=NULL){
pb=Lb->next;
while(pb!=NULL&&pb->data
data)
pb=pb->next;
if(pb!=NULL&&pb->data==pa->data)
//若pa结点值在pb中
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
tc->next=s;
tc=s;
}
pa=pa->next;}
tc->next=NULL;return(Lc);
第 页
内蒙古工业大学信息工程学院
}
LinkList *Subs(LinkList *La,LinkList *Lb,LinkList *Lc)
//求两有序集合的差集 {
LinkList *pa=La->next,*pb,*s,*tc;
Lc=(LinkList *)malloc(sizeof(LinkList));
tc=Lc;
while(pa!=NULL){
pb=Lb->next;
while(pb!=NULL&&pb->data
data)
pb=pb->next;
if(!(pb!=NULL&&pb->data==pa->data))
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
tc->next=s;
tc=s;
}
pa=pa->next;} tc->next=NULL;return(Lc);}
void main(){
LinkList *La,*Lb,*Lc;
int num=0,loop,j;loop=1;La=CreatlinkR(La);Lb=CreatlinkR(Lb);Sort(La);Sort(Lb);
printf(“有序集合A={ ”);
DispList(La);
printf(“}n”);
printf(“有序集合B={ ”);
DispList(Lb);printf(“}n”);while(loop){
printf(“请选择您要执行的操作:1.求并集
scanf(”%d“,&j);printf(”n%d“,j);
第 页
//若pa结点值不在pb中 2.求交集
3.求差集n”);
内蒙古工业大学信息工程学院
if(j>=1&&j<=3)
switch(j)
{
case 1: Lc=Union(La,La,Lc);
printf(“集合A与集合B的并集C={ ”);
DispList(Lc);
printf(“}n”);
break;
case 2: Lc=InsterSect(La,Lb,Lc);
printf(“集合A与集合B的交集C={ ”);
DispList(Lc);
printf(“}n”);
break;
case 3: Lc=Subs(La,Lb,Lc);
printf(“集合A与集合B的差集C={ ”);
DispList(Lc);
printf(“}n”);
break;
} printf(“0.结束
1.继续n”);scanf(“%d”,&loop);printf(“n”);} }
五、运行结果:
1.输入两个无序集合,排序后输出:
第 页
内蒙古工业大学信息工程学院
2.求集合的并集:
3.选1继续:
第 页
内蒙古工业大学信息工程学院
4.求集合的交集:
5.求集合的差集:
第 页
内蒙古工业大学信息工程学院
6.选0结束:
第 页
第三篇:二叉树的构造函数算法BiTree
template
BiTree ::BiTree(BiNode
creat(root);
}
template
void BiTree ::Creat(BiNode
cin>>ch;
if(ch=='# ')root=NULL;//建立一棵空树else {
root=new BiNode
Creat(root->lchild);//递归建立左子树Creat(root->rchild);//递归建立右子树}
}
第四篇:算法描述与设计教案
课型:新课 《算法与程序设计》(选修)人教版
教学目标:
1.进一步理解什么是;算法,知道算法的多样性
2.能够对设计的算法做简装的评价
3.学会利用自然语言、流程图和伪代码来描述算法
教学内容
1.了解什么是算法及其特征 2.学习三种描述算法语言
教学重点:通过例子设计算法
教学难点:三种描述算法语言的使用
课时数:1课时
正课讲解
一、算法是“灵魂”
1.算法存在于人们生活中,如:上街购物、顾客付款、营业员(主)找银等。
2.“韩信点兵问题”有不同的求解过程,就有不同的算法。
有N个人,除以3,5,7,分别余2,3,2,求N。
3.算法——解决问题的方法和步骤。
算法是尼克劳斯.沃斯(N.Writh)提出的,他指出:算法+数据结构=程序。
(即算法不能单独构成程序,它必须和数据结构合二为一)
4.算法的发现
时间:公元前3000年~公元前1500年 地点:巴比伦
巴比伦人求解“算法”的过程:先用解代数方法,再计算实际数目,最后写上一句短句“这就是一个过程”。
5.算法的特征
我们曾在必须修课中提过一点算法,如:冒泡排序法。
例:计算1+2+3+„„+100=?
分析:这个算法有限制范围,可以在有限时间内完成,这是算法的第一个特征:有穷性。计算此算法可以用纸笔、算盘、运算器
和计算机来完成,且计算过程是多样的,但结果是唯一的。这就是算法的可行性、确定性。
计算方法:
⑴把这100个数按顺序相加。
⑵用凑数法:1+99=100,2+98=100,3+97=100,„„,49+51,最后只剩下50和100。
⑶令S=0,使1≤n≤100,先执行S=S+n ⑴,再执行n=n+1 ⑵
n=1,S=0时,S(0)=1 n=2,S=1时,S(0)=3 n=3,S=3时,S(0)=6
n=4,S=6时,S(0)=10 n=5,S=10时,S(0)=15 n=6,S=15时,S(0)=21„„
算法的另外一个特征:输入、输出。
练习:水仙花数问题,如153=1^3+5^3+3^3,分析它应满足什么条件才能使用此方法?
二、如何描述算法
1.用自然语言描述算法
⑴自然语言——人们日常生活中使用的语言。
⑵此种语言的特点:通俗语易懂,缺乏直观性和简洁,且易产生歧义。
使用此种语言的注意事项:描述要求尽可能精确,详尽。
例:用自然语言描述凯撒密码的原理
第1步:输入26个英文字母,它们分别对应1~26个数学。
第2步:令a=1,k=3,n=26。
第3步:使a的取值范围为1≤a≤26,F(a)=(a+k)mod n,转第5步。
第4步:a=a+1,转第3步。
第5步:输出F(a)相对应的数字。
第6步:把数学转化成相当的字母,输出字母。
第7步:累计字母出现顺序,转第4步。
练习:现有一串字母“PROGRAM”给它加密,请设计算法,用自然语言描述。
2.用流程图描述算法
⑴特点:描述算法形象、直观,容易理解。
⑵流程图符号
3.用伪代码描述算法
特点:描述的算法简、易懂,修改容易,容易转化为程序语言代码。
例:分析课本经9页算法描述
第一个条件:y mod 4=0
判断闰年的条件:⑴y不能被100整除;⑵y能被400整除且y能被400整除。
判断不是闰年的条件:⑴y mod 4=0 且y mod 100=0,但y不能被400整除;⑵y不能被4整除。
表示条件判断语句 表示循环处理语句:
IF 条件 THEN 执行语句一 Do While 条件循环语句
ELSE执行语句二 Loop
END IF
条件语句中可以包含多个子语句
实践:用表格比较自然语言、流程图和伪代码3种描述方法的优缺点。
第五篇:数据结构算法设计与分析
数据结构算法设计与分析、计算机网络、计算机组成原理、操作系统原理、编译原理、数据库原理及应用、软件工程、软件测试等计算机基础理论课程;
网页制作、程序设计Java、JSP程序设计、Oracle、XML程序设计、计算机网络、SSH(Struts+Spring+Hibernate)框架、Java EE程序设计、Ajax程序设计、Linux+PHP+MySQL程序设计、Android手机开发、UML系统分析与设计、性能测试、自动化软件测试、软件质量保证、毕业设计及项目综合实训等。
数据结构、计算机网络、计算机组成原理、操作系统原理、编译原理、数据库原理及应用、金融学概论、西方经济学等基础理论课程;
网页制作、程序设计Java、JSP程序设计、J2EE程序设计、SQL Server数据库、Oracle数据库、Linux操作系统、UML系统分析与设计、软件工程、XML程序设计、SSH框架、金融市场学、ERP财务管理、管理信息系统、投资银行学、商业银行学、国际金融管理、毕业设计及项目综合实训等专业课程。
数据结构、计算机网络、计算机组成原理、操作系统原理、数据库原理及应用、软件工程、软件测试等计算机基础理论课程;
网页制作、程序设计Java、JSP程序设计、J2EE程序设计、XML程序设计、Ajax程序设计、SSH框架、Android手机开发、Linux+PHP+MySQL程序设计、SQL Server数据库、Linux操作系统、UML系统分析与设计、软件项目管理、行业标准与规范、IT服务管理、IT职业英语、毕业设计及项目综合实训等专业课程