实验五查找算法的设计Word文档格式.docx
《实验五查找算法的设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验五查找算法的设计Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
建立c1.h放程序名;
#include<
string.h>
ctype.h>
malloc.h>
limits.h>
stdio.h>
stdlib.h>
io.h>
math.h>
process.h>
iostream.h>
//状态代码
#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;
ST.length;
{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&
{Statusf;
f=Creat_Seq(ST,n);
if(f)
Ascend(ST);
returnf;
StatusDestroy(SSTable&
free(ST.elem);
ST.elem=NULL;
ST.length=0;
returnOK;
intSearch_Seq(SSTableST,KeyTypekey)
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;
Visit(*p++);
建立程序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
c9.h"
c9-1.h"
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;
N;
r[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);
请输入待查找人的总分"
scanf("
%d"
&
s);
i=Search_Seq(st,s);
if(i)
print(*(st.elem+i));
else
print("
没找到\n"
Destroy(st);
2、有序表查找,同一个文件夹中建立如下五个文件c1.h;
algo9-2.cpp;
对于algo9-2.cpp进行编译、构建和运行;
建立文件algo9-2.cpp并利用实验一的文件编译
#defineN11
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}};
(%d%d)"
c.key,c.others);
SSTablest;
KeyTypes;
Creat_Ord(st,N);
Traverse(st,print);
\n"
请输入待查找值的关键字"
);
scanf("
i=Search_Bin(st,s);
if(i)
(%d%d)%d是第%d个记录的关键字\n"
st.elem[i].key,st.elem[i].others,s,i);
else
没有找到\n"
Destroy(st);
3、树在同一个文件夹中建立如下五个文件c1.h;
c6-2.h;
bo9-2.cpp;
algo9-4.cpp;
建立c6-2.h放二叉树的二叉链表存储表示
typedefstructBiTNode
TElemTypedata;
BiTNode*lchild,*rchild;
}BiTNode,*BiTree;
建立文件bo9-2.cpp存储动态查找表的基本操作
typedefElemTypeTElemType
c6-2.h"
StatusInitDSTable(BiTree&
DT)
DT=NULL;
voidDestroyDSTable(BiTree&
if(DT)
{
if(DT->
lchild)
DestroyDSTable(DT->
lchild);
rchild)
rchild);
free(DT);
BiTreeSearchBST(BiTreeT,KeyTypekey)
if(!
T)||EQ(key,T->
data.key)
returnT;
elseifLT(key,T->
returnSearchBST(T->
lchild,key);
rchild,key);
voidSearchBST(BiTree&
T,KeyTypekey,BiTreef,BiTree&
p,Status&
flag)
T)
p=f;
flag=FALSE;
elseifEQ(key,T->
p=T;
flag=TRUE;
SearchBST(T->
lchild,key,T,p,flag);
rchild,key,T,p,flag);
StatusInsertBST(BiTree&
T,ElemTypee)
BiTreep,s;
Statusflag;
SearchBST(T,e.key,NULL,p,flag);
s=(BiTree)malloc(sizeof(BiTNode));
s->
data=e;
lchild=s->
rchild=NULL;
p)
T=s;
elseifLT(e.key,p->
p->
lchild=s;
rchild=s;
returnTRUE;
returnFALSE;
voidDelete(BiTree&
BiTreeq,s;
p->
q=p;
p=p->
lchild;
free(q);
elseif(!
rchild;
s=p->
while(s->
q=s;
s=s->
data=s->
data;
if(q!
=p)
q->
rchild=s->
free(s);
StatusDeleteBST(BiTree&
T,KeyTypekey)
{//若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点,
//并返回TRUE;
否则返回FALSE。
算法9.7
T)//不存在关键字等于key的数据元素
returnFALSE;
ifEQ(key,T->
data.key)//找到关键字等于key的数据元素
Delete(T);
elseifLT(key,T->
DeleteBST(T->
else
returnTRUE;
voidTraverseDSTable(BiTreeDT,void(*Visit)(ElemType))
{//初始条件:
动态查找表DT存在,Visit是对结点操作的应用函数
//操作结果:
按关键字的顺序对DT的每一个结点调用函数Visit()一且至多一次
TraverseDSTable(DT->
lchild,Visit);
Visit(DT->
data);
rchild,Visit);
建立algo9-4.cpp检验bo9-2.cpp的程序
//alog9-4.cpp的程序
#defineN10
intothers;
};
bo9-2.cpp"
(%d,%d)"
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);
InsertBSTable(dt,r[i]);
TraverseDSTable(dt,print);
请输入待查找的值:
scanf("
j);
p=SearchBST(dt,j);
if(p)
printf("
表中存在此值:
"
DeleteBST(dt,j);
删除此值后:
TraverseDSTable(dt,print);
表中不存在此值\n"
DestroyDSTable(dt);
4、实验结果:
1、顺序表查找
2、有序表查找
3、二叉查找树
5、实验心得
通过本次试验,让我对课堂所学的知识进行了巩固和提高,对顺序表、有序表和二叉树等知识进行了进一步的学习,并学会了设计查找算法。
尽管这个程序很长,但进过我们小组同学的认真思考、讨论,以及分工合作,终于完成了实验,也让我们意识到,平时的学习不光要学会书本上的知识,还应以实践为主,只有付诸实践才能体现出程序设计的重要性。