实验五查找算法的设计.docx

上传人:b****7 文档编号:9606872 上传时间:2023-02-05 格式:DOCX 页数:18 大小:92.72KB
下载 相关 举报
实验五查找算法的设计.docx_第1页
第1页 / 共18页
实验五查找算法的设计.docx_第2页
第2页 / 共18页
实验五查找算法的设计.docx_第3页
第3页 / 共18页
实验五查找算法的设计.docx_第4页
第4页 / 共18页
实验五查找算法的设计.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

实验五查找算法的设计.docx

《实验五查找算法的设计.docx》由会员分享,可在线阅读,更多相关《实验五查找算法的设计.docx(18页珍藏版)》请在冰豆网上搜索。

实验五查找算法的设计.docx

实验五查找算法的设计

学校代码:

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;i

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);

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;i

InsertBSTable(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、实验心得

通过本次试验,让我对课堂所学的知识进行了巩固和提高,对顺序表、有序表和二叉树等知识进行了进一步的学习,并学会了设计查找算法。

尽管这个程序很长,但进过我们小组同学的认真思考、讨论,以及分工合作,终于完成了实验,也让我们意识到,平时的学习不光要学会书本上的知识,还应以实践为主,只有付诸实践才能体现出程序设计的重要性。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1