程序设计类课程实验报告.docx
《程序设计类课程实验报告.docx》由会员分享,可在线阅读,更多相关《程序设计类课程实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
程序设计类课程实验报告
国脉信息学院
(程序设计类课程)
实验报告
课程名称:
算法与数据结构
姓名:
张三
系:
计算机科学与技术
专业:
年级:
学号:
指导教师:
李小林
职称:
副教授
2012年11月日
实验项目列表
序号
实验项目名称
成绩
指导教师
1
第七章检索及基本算法
2
3
4
5
6
7
8
9
10
11
12
福建农林大学计算机与信息学院实验报告
系:
计算机科学与技术专业:
年级:
姓名:
张三学号:
实验室号____计算机号93
实验时间:
2012.6.1指导教师签字:
成绩:
实验七检索
一、实验目的和要求
1)掌握检索的不同方法,并能用高级语言实现检索算法。
2)熟练掌握顺序表和有序表的检索方法,以及静态检索树的构造方法和检索算法,理解静态检索树的折半检索方法。
3)熟练掌握二叉排序树的构造和检索方法。
4)熟悉各种存储结构的特征以及如何应用树结构解决具体问题。
二、实验内容和原理
实验内容:
1)编程实现在二叉检索树中删除一个结点的算法。
2)编程实现Fibonacci检索算法。
实验原理:
1)构造排序树,每输入一个数就进行排序,选择插入的结点,删除结点,没删除一个节点就返回到构造排序树的方法。
2)Fibonacci数的定义为f0=0,f1=1,fi=f(i-1)+f(i-2)(i≥2)。
由此得Fibonacci数列为0,1,1,2,3,5,8,13,21,34,55,89,144,……
设数组F中元素按关键字值从小到大顺序排列,并假定元素个数n比某个Fibonacci树fi小1,即n=fi-1。
第一次用待查关键字k与F[f(i-1)],Key比较,其算法描述如下:
①若k=F[f(i-1)],Key,则检索成功,F[f(i-1)]为k所在记录。
②若k③若k>F[f(i-1)],Key,则下一次的检索范围为下标f(i+1)+1到fi-1,序列长度为(fi-1)-(f(i-1)+1)+1=fi-f(i-1)-1=f(i-2)-1
设F是顺序存储的线性表且满足F[1],key≤F[2],key≤…≤F[n]。
key,k是已知的关键字值,在F中检索关键字值为k的记录。
若找到返回其下标值,否则返回0.
三、实验环境
WindowsXP系统
visualc++6.0
四、算法描述及实验步骤
实验习题一:
#include"stdio.h"
#include"malloc.h"
structBTnode
{
intdata;
structBTnode*lchild,*rchild;
}*root;
typedefstructBTnodeNode,*Nodep;
voidcreatetree(intdata)
{
Node*node,*p,*q;
node=(Nodep)malloc(sizeof(Node));
node->data=data;
node->lchild=0;
node->rchild=0;
if(root==0)
{
root=node;
return;
}
else
{
p=root;
while(p!
=0)
{
if(datadata)
{
q=p;
p=p->lchild;
if(p==0)
q->lchild=node;
}
else
if(data>p->data)
{
q=p;
p=p->rchild;
if(p==0)
q->rchild=node;
}
else
break;
}
}
}
voidshowtree(structBTnode*proot,structBTnode*m,intspace)
{
inti;
charb;
if(proot!
=0)
{
for(i=1;i<=space-3;i++)
printf("");
if(space-3>=0)
printf("---->");
if(proot==root)
printf("%d\n",proot->data);
else
{
if(m->data>proot->data)
b='L';
else
b='R';
printf("%d(%c)",proot->data,b);
printf("\n");
}
m=proot;
showtree(proot->lchild,m,space+6);
showtree(proot->rchild,m,space+6);
}
}
Nodepdeletep(Node*p)
{
Node*q,*t;
t=p;
if(p->lchild!
=0)
{
p=p->lchild;
q=p;
while(p->rchild!
=0)
{
q=p;
p=p->rchild;
}
if(p==q)
{
p->rchild=t->rchild;
free(t);
return(p);
}
if(p->lchild!
=0)
q->rchild=p->lchild;
else
q->rchild=0;
p->lchild=t->lchild;
p->rchild=t->rchild;
free(t);
return(p);
}
else
if(p->rchild!
=0)
{
p=p->rchild;
q=p;
while(p->lchild!
=0)
{
q=p;
p=p->lchild;
}
if(p==q)
{
p->lchild=t->lchild;
free(t);
return(p);
}
if(p->rchild!
=0)
q->lchild=p->rchild;
else
q->lchild=0;
p->rchild=t->rchild;
p->lchild=t->lchild;
free(t);
return(p);
}
else
{
free(p);
return(0);
}
}
NodepdeleteBTnode(intx)
{
Node*p=root,*q;
while(p!
=0)
{
q=p;
if(p->data>x)
if(p->lchild)
p=p->lchild;
else
break;
else
if(p->dataif(p->rchild)
p=p->rchild;
else
break;
if(p->data==x)
break;
}
if((p==root)&&(p->data==x))
root=deletep(p);
else
if((p==q->lchild)&&(p->data==x))
q->lchild=deletep(p);
else
if((p==q->rchild)&&(p->data==x))
q->rchild=deletep(p);
else
if(p->data!
=x)
{printf("cannotfoundthedatayouwanttodelete,pleasecheckit!
\n");
return0;
}
returnroot;
}
intmain()
{charch;
intdata;
printf("Enter'c'createtree,Enter'd'deleteanode:
");
scanf("%c",&ch);
getchar();
root=0;
while(ch=='c'||ch=='d')
{if(ch=='c')
{printf("pleaseinputthekey:
");
scanf("%d",&data);
getchar();
createtree(data);
showtree(root,0,0);
}
else
{printf("pleaseinputthekeyofthenodeyouwantdel:
");
scanf("%d",&data);
getchar();
if(deleteBTnode(data))
showtree(root,0,0);
}
printf("Enter'c'createtree,Enter'd'deleteanode:
");
scanf("%c",&ch);
}
return0;
}
实验习题二:
#include"stdio.h"
typedefintkeytype;
typedefintdatatype;
typedefstructnode
{
intkey;
}rectype;
intfibonacci(intn)
{
if(n==0)return0;
else
if(n==1)return1;
else
returnfibonacci(n-1)+fibonacci(n-2);}
voidprintData(rectypeR[],intn)
{
inti;
for(i=1;i<=n;i++)
{
printf("%5d",R[i].key);
if(i%8==0)printf("\n");}
printf("\n");
}
intfibsearch(rectypeR[],keytypeK,intn)
{
intm,i,p,q,t;
for(m=0;fibonacci(m)<=(n+1);m++){}
m--;
i=fibonacci(m-1);
p=fibonacci(m-2);
q=fibonacci(m-3);
while(i>=0&&i<=n)
{
if(K==R[i].key)
{
returni;}
elseif(K{
i=i-q;
t=p;
p=q;
q=t-q;}
elseif(K>R[i].key)
{
i=i+q;
p=p-q;
q=q-p;
}
}
return0;
}
voidmain()
{
intm,i,k,n;
rectypeR[20];
printf("Enterknum:
");
scanf("%d",&k);
printf("enterR[20]:
");
for(i=1;i<=20;i++)
{
scanf("%d",&R[i].key);
}
printData(R,20);
m=fibsearch(R,k,20);
if(m==0)
{
printf("Notfound!
\n");
}
else
printf("TheKeyhasbeenfoundatR[