实验五查找算法的设计.docx
《实验五查找算法的设计.docx》由会员分享,可在线阅读,更多相关《实验五查找算法的设计.docx(18页珍藏版)》请在冰豆网上搜索。
实验五查找算法的设计
学校代码:
10128
学号:
201220905048
《数据结构》实验报告
(
题目:
查找算法的设计
学生姓名:
孙跃
学院:
理学院
系别:
数学系
专业:
信息与计算科学
班级:
信计12-2班
任课教师:
杜雅娟
二〇一四年十一月
一、实验目的
掌握查找算法的知识,学会设计查找算法。
2、实验内容
1、顺序表查找
2、有序表查找
3、二叉查找树
3、概要设计
1、查找在同一个文件夹中建立如下五个文件c1.h;c9.h;c9-1.h;bo9-1.cpp;algo9-1.cpp;对于algo9-1.cpp进行编译、构建和运行;
建立c1.h放程序名;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//状态代码
#defineTURE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
typedefintStatus;
typedefintBoolean;
建立文件c9-1.h放静态查找表的顺序存储结构
//c9-1.h
typedefstruct
{
ElemType*elem;
intlength;
}SSTable;
建立文件c9.h放对两个数值型关键字的比较约定为如下宏定义
//c9.h
#defineEQ(a,b)((a)==(b))
#defineLT(a,b)((a)<(b))
#defineLQ(a,b)((a)<=(b))
建立文件bo9-1.cpp放静态查找表的基本操作
StatusCreat_Seq(SSTable&ST,intn)
{inti;
ST.elem=(ElemType*)calloc(n+1,sizeof(ElemType));
if(!
ST.elem)
returnERROR;
for(i=1;i<=n;i++)
*(ST.elem+i)=r[i-1];
ST.length=n;
returnOK;
}
voidAscend(SSTable&ST)
{inti,j,k;
for(i=1;i{k=i;
ST.elem[0]=ST.elem[i];
for(j=i+1;j<=ST.length;j++)
ifLT(ST.elem[j].key,ST.elem[0].key)
{k=j;
ST.elem[0]=ST.elem[j];
}
if(k!
=i)
{
ST.elem[k]=ST.elem[i];
ST.elem[i]=ST.elem[0];
}
}
}
StatusCreat_Ord(SSTable&ST,intn)
{Statusf;
f=Creat_Seq(ST,n);
if(f)
Ascend(ST);
returnf;
}
StatusDestroy(SSTable&ST)
{
free(ST.elem);
ST.elem=NULL;
ST.length=0;
returnOK;
}
intSearch_Seq(SSTableST,KeyTypekey)
{inti;
ST.elem[0].key=key;
for(i=ST.leng;!
EQ(ST.elem[i].key,key);--i)
returni;
}
intSearch_Bin(SSTableST,KeyTypekey)
{intlow,high,mid;
low=1;
high=ST.length;
while(low<=high)
{mid=(low+high)/2;
ifEQ(key,ST.elem[mid].key)
returnmid;
elseifLT(key,ST.elem[mid].key)
high=mid-1;
else
low=mid+1;
}
return0;
}
StatusTraverse(SSTableST,void(*Visit)(ElemType))
{
Elemtype*p;
inti;
p=++ST.elem;
for(i=1;i<=ST.length;i++)
Visit(*p++);
returnOK;
}
建立程序algo9-1.cpp检验bo9-1.cpp的程序
//alog9-1.cpp检验bo9-1.cpp(顺序表部分)的程序
#include"c1.h"
#defineN5
typedefintKeyType;
structElemType
{
longnumber;
charname[9];
intpolitics;
intChinese;
intEnglish;
intmath;
intphysics;
intchemistry;
intbiology;
KeyTypekey;
}r[N]={{179324,"何芳芳",85,89,98,100,93,80,47},
{179325,"陈红",85,86,88,100,92,90,45},
{179326,"陆华",78,75,90,80,95,88,37},
{179327,"张平",82,80,78,98,84,96,40},
{179328,"赵小怡",76,85,94,57,77,69,44}};
#definetotalkey
#include"c9.h"
#include"c9-1.h"
#include"bo9-1.cpp"
voidprint(ElemTypec)
{
printf("%-8ld%-8s%4d%5d%5d%5d%5d%5d%5d%5d"\n,c.number,c.name,c.politics,c.Chinese,c.English,c.math,c.chemistry,c.biology,c.total);
}
voidmain()
{
SSTablest;
inti,s;
for(i=0;ir[i].total=r[i].politics+r[i].Chinese+r[i].English+r[i].math+r[i].physics+r[i].chemistry+r[i].biology;
Creat_Seq(st,N);
printf("准考证号姓名政治语文外语数学物理化学生物总分\n");
Traverse(st,print);
printf("请输入待查找人的总分");
scanf("%d",&s);
i=Search_Seq(st,s);
if(i)
print(*(st.elem+i));
else
print("没找到\n");
Destroy(st);}
2、有序表查找,同一个文件夹中建立如下五个文件c1.h;c9.h;c9-1.h;bo9-1.cpp;algo9-2.cpp;对于algo9-2.cpp进行编译、构建和运行;
建立文件algo9-2.cpp并利用实验一的文件编译
#include"c1.h"
#defineN11
typedefintKeyType;
structElemType
{
KeyTypekey;
intothers;
}r[N]={{5,1},{13,2},{19,3},{21,4},{37,5},{56,6},{64,7},{75,8},{80,9},{88,10},{92,11}};
#include"c9.h"
#include"c9-1.h"
#include"bo9-1.cpp"
voidprint(ElemTypec)
{
printf("(%d%d)",c.key,c.others);
}
voidmain()
{
SSTablest;
inti;
KeyTypes;
Creat_Ord(st,N);
Traverse(st,print);
printf("\n");
printf("请输入待查找值的关键字");
scanf("%d",&s);
i=Search_Bin(st,s);
if(i)
printf("(%d%d)%d是第%d个记录的关键字\n",st.elem[i].key,st.elem[i].others,s,i);
else
printf("没有找到\n");
Destroy(st);
}
3、树在同一个文件夹中建立如下五个文件c1.h;c6-2.h;bo9-2.cpp;algo9-4.cpp;对于algo9-1.cpp进行编译、构建和运行;
建立c6-2.h放二叉树的二叉链表存储表示
typedefstructBiTNode
{
TElemTypedata;
BiTNode*lchild,*rchild;
}BiTNode,*BiTree;
建立文件bo9-2.cpp存储动态查找表的基本操作
typedefElemTypeTElemType
#include"c6-2.h"
StatusInitDSTable(BiTree&DT)
{
DT=NULL;
returnOK;
}
voidDestroyDSTable(BiTree&DT)
{
if(DT)
{
if(DT->lchild)
DestroyDSTable(DT->lchild);
if(DT->rchild)
DestroyDSTable(DT->rchild);
free(DT);
DT=NULL;
}
}
BiTreeSearchBST(BiTreeT,KeyTypekey)
{
if(!
T)||EQ(key,T->data.key)
returnT;
elseifLT(key,T->data.key)
returnSearchBST(T->lchild,key);
else
returnSearchBST(T->rchild,key);
}
voidSearchBST(BiTree&T,KeyTypekey,BiTreef,BiTree&p,Status&flag)
{
if(!
T)
{
p=f;
flag=FALSE;
}
elseifEQ(key,T->data.key)
{
p=T;
flag=TRUE;
}
elseifLT(key,T->data.key)
SearchBST(T->lchild,key,T,p,flag);
else
SearchBST(T->rchild,key,T,p,flag);
}
StatusInsertBST(BiTree&T,ElemTypee)
{
BiTreep,s;
Statusflag;
SearchBST(T,e.key,NULL,p,flag);
if(!
flag)
{
s=(BiTree)malloc(sizeof(BiTNode));
s->data=e;
s->lchild=s->rchild=NULL;
if(!
p)
T=s;
elseifLT(e.key,p->data.key)
p->lchild=s;
else
p->rchild=s;
returnTRUE;
}
else
returnFALSE;
}
voidDelete(BiTree&p)
{
BiTreeq,s;
if(!
p->rchild)
{
q=p;
p=p->lchild;
free(q);
}
elseif(!
p->lchild)
{
q=p;
p=p->rchild;
free(q);
}
else
{
q=p;
s=p->lchild;
while(s->rchild)
{
q=s;
s=s->rchild;
}
p->data=s->data;
if(q!
=p)
q->rchild=s->lchild;
else
q->lchild=s->lchild;
free(s);
}
}
StatusDeleteBST(BiTree&T,KeyTypekey)
{//若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点,
//并返回TRUE;否则返回FALSE。
算法9.7
if(!
T)//不存在关键字等于key的数据元素
returnFALSE;
else
{
ifEQ(key,T->data.key)//找到关键字等于key的数据元素
Delete(T);
elseifLT(key,T->data.key)
DeleteBST(T->lchild,key);
else
DeleteBST(T->rchild,key);
returnTRUE;
}
}
voidTraverseDSTable(BiTreeDT,void(*Visit)(ElemType))
{//初始条件:
动态查找表DT存在,Visit是对结点操作的应用函数
//操作结果:
按关键字的顺序对DT的每一个结点调用函数Visit()一且至多一次
if(DT)
{
TraverseDSTable(DT->lchild,Visit);
Visit(DT->data);
TraverseDSTable(DT->rchild,Visit);
}
}
建立algo9-4.cpp检验bo9-2.cpp的程序
//alog9-4.cpp的程序
#include"c1.h"
#defineN10
typedefintKeyType;
structElemType
{
KeyTypekey;
intothers;
};
#include"c9.h"
#include"bo9-2.cpp"
voidprint(ElemTypec)
{
printf("(%d,%d)",c.key,c.others);
}
voidmain()
{
BiTreedt,p;
inti;
KeyTypej;
ElemTyper[N]={{45,1},{12,2},{53,3},{3,4},{37,5},{24,6},{100,7},{61,8},{90,9},{78,10}};
InitDSTable(dt);
for(i=0;iInsertBSTable(dt,r[i]);
TraverseDSTable(dt,print);
printf("请输入待查找的值:
\n");
scanf("%d",&j);
p=SearchBST(dt,j);
if(p)
{
printf("表中存在此值:
");
DeleteBST(dt,j);
printf("删除此值后:
\n");
TraverseDSTable(dt,print);
printf("\n");
}
else
printf("表中不存在此值\n");
DestroyDSTable(dt);
}
4、实验结果:
1、顺序表查找
2、有序表查找
3、二叉查找树
5、实验心得
通过本次试验,让我对课堂所学的知识进行了巩固和提高,对顺序表、有序表和二叉树等知识进行了进一步的学习,并学会了设计查找算法。
尽管这个程序很长,但进过我们小组同学的认真思考、讨论,以及分工合作,终于完成了实验,也让我们意识到,平时的学习不光要学会书本上的知识,还应以实践为主,只有付诸实践才能体现出程序设计的重要性。