搜索实验报告.docx
- 文档编号:11118843
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:19
- 大小:91.67KB
搜索实验报告.docx
《搜索实验报告.docx》由会员分享,可在线阅读,更多相关《搜索实验报告.docx(19页珍藏版)》请在冰豆网上搜索。
搜索实验报告
重庆交通大学
设计性实验报告
班级:
计软2班
学号:
姓名:
旧城余约
实验项目名称:
搜索
实验项目性质:
设计性实验
实验所属课程:
算法与数据结构
实验室(中心):
B01-407
指导教师:
鲁云平
实验完成时间:
2015年5月20日
教师评阅意见:
签名:
年月日
实验成绩:
一、实验目的
应用线性结构、树形结构实现查找。
二、实验内容及要求
内容:
1)有序表的二分查找;
2)二叉排序树的查找。
要求:
1)建立有序表,然后进行二分查找;
2)建立二叉排序树,然后查找。
三、实验设备及软件
设备:
计算机;
软件:
visualC++
四、实验过程及步骤
运行环境:
visualC++;
实现思路:
首先,是有序表的书写,是在顺序表的基础上用有序插入控制数据的有序输入,从而建立有序表,为后面的二分法查找数据做准备。
顺序表的数据成员中,用*element来存储数据,MaxSize表示最大存储空间,length表示当前存储长度;在成员函数中,voidInsert(T&x)用来有序插入数据建立有序表,每次插入数据前都要与已有数据进行比较大小,从而确定插入位置,同时voidSearch(T&x)用来二分法查找数据,先定义两个起始位置和末位置的变量以及一个中间位置的变量,每次用要查找的数与中间位置的数据进行比较,如果小则末位置为中间位置加一,反之起始位置为中间位置减一;
然后,是二分排序树的书写,有二叉树结点BinaryTreeNode,包括数据域data,左子树指针leftChild以及右子树指针rightChild;在BinarySearchTree中用voidInsert(T&x,BinaryTreeNode
最后,用菜单进行实现。
编译步骤:
在写类的时候,逐个函数进行测试。
五、主要代码及运行结果
(一)、主要代码:
SeqList类:
#include<>
template
classSeqList
{
private:
T*element;
intMaxSize;
intlength;
public:
SeqList(intMaxListSize=10);
~SeqList()
{
if(element)
delete[]element;
}
boolIsEmpty()
{returnlength==0;}
intLength()
{returnlength;}
boolFind(inti,T&x);//将第i个元素的值用x返回
SeqList
voidSearch(T&x);//二分法搜索函数
voidInsert(T&x);//有序插入建立有序表
voidOutput();
TGetNumber(inti)
{returnelement[i];}
};
template
SeqList
:
SeqList(intMaxListSize)
{
MaxSize=MaxListSize;
element=newT[MaxSize];
length=0;
}
template
boolSeqList
:
Find(inti,T&x)
{
if(i<1||i>length)
returnfalse;
else
{
x=element[i-1];
returntrue;
}
}
template
voidSeqList
:
Search(T&x)
{
inthigh=length;
intlow=0;
intmid;
while(low<=high)
{
mid=(low+high)/2;
if(x>element[mid])
low=mid+1;
elseif(x high=mid-1; elseif(x==element[mid]) { cout<<"查找成功! "< cout< break; } } if(x! =element[mid]&&(mid==low||mid==high)) cout<<"查找失败"< } template voidSeqList : Output() { for(inti=0;i cout< } template voidSeqList : Insert(T&x)//有序插入函数 { inti=0; while(i i++; for(intj=length;j>i;j--)//有序插入 element[j]=element[j-1]; element[i]=x; length++; } BinarySearchTree类: #include usingnamespacestd; template classBinarySearchTree; template classBinaryTreeNode { protected: Tdata; BinaryTreeNode public: //BinaryTreeNode(): leftChild(NULL),rightChild(NULL){}//构造函数 //BinaryTreeNode(Td): data(d),leftChild(NULL),rightChild(NULL){}//构造函数 BinaryTreeNode(Td=0,BinaryTreeNode*L=NULL,BinaryTreeNode*R=NULL): data(d),leftChild(L),rightChild(R){}//构造函数 ~BinaryTreeNode() { if(leftChild) deleteleftChild; if(rightChild) deleterightChild; } TGetData() {returndata;} friendclassBinarySearchTree }; template classBinarySearchTree { private: BinaryTreeNode Tstopvalue;//数据输入停止标志,用于输入 voidInsert(T&x,BinaryTreeNode BinaryTreeNode voidTraverse(ostream&out,BinaryTreeNode public: BinarySearchTree(): root(NULL){}//构造函数 BinarySearchTree(Tvalue): stopvalue(value),root(NULL){}//构造函数 ~BinarySearchTree() { if(root) deleteroot; }//析构函数 intFind(Tx) {returnFind(x,root)! =NULL;}//查找 voidInsert(T&x) {Insert(x,root);}//插入新元素 voidTraverse(ostream&out) {Traverse(out,root);} }; template BinaryTreeNode : Find(Tx,BinaryTreeNode { if(ptr==NULL) { cout<<"搜索失败! "< returnNULL;//搜索失败 } elseif(x returnFind(x,ptr->leftChild);//在左子数查找 elseif(x>ptr->data) returnFind(x,ptr->rightChild);//在右子数查找 else { cout<<"搜索成功! "< returnptr;//相等,搜索成功 } } template voidBinarySearchTree : Insert(T&x,BinaryTreeNode { if(ptr==NULL)//新节点作为叶子结点插入 { ptr=newBinaryTreeNode if(ptr==NULL) {cout<<"内存不足! "< (1);} } elseif(x Insert(x,ptr->leftChild);//小于等于根的关键字,向左子树插入 //我不清楚和根相等的关键字往哪里存 elseif(x>ptr->data) Insert(x,ptr->rightChild);//大于根的关键字,向右子数插入 } /*template voidBinarySearchTree : Remove(constT&x,BinaryTreeNode { BinaryTreeNode if(ptr! =NULL) if(x Remove(x,ptr->leftChild); elseif(x>ptr->data) Remove(x,ptr->rightChild); elseif(ptr->leftChild! =NULL&&ptr->rightChild! =NULL) { temp=Min(ptr->rightChild); ptr->data=temp->data; Remove(ptr->data,ptr->rightChild); } else { temp=ptr; if(ptr->leftChild==NULL) ptr=ptr->rightChild; elseif(ptr->leftChild==NULL) ptr=ptr->leftChild; deletetemp; } }*/ template voidBinarySearchTree : Traverse(ostream&out,BinaryTreeNode 搜索并输出根为subTree的二叉树 { if(subTree! =NULL) { out< Traverse(out,subTree->leftChild);//递归搜索并输出subTree的左子树 Traverse(out,subTree->rightChild);//递归并输出subTree的右子树 } } /*template ostream&operator<<(ostream&out,BinarySearchTree { out); out< returnout; }*/ Menu类: #include"" #include"" template classMenu { public: voidBillsOfSearch(SeqList voidInputNumber(SeqList voidOutputNumber(SeqList voidSearchNumber(SeqList }; template voidMenu : BillsOfSearch(SeqList { intchoice; while(choice) { cout< cout<<"\n=============================\n"; cout<<"|搜索选项|\n"; cout<<"=============================\n"; cout<<"~~~~~~~1、输入数据! ~~~~~~~~~\n"; cout<<"~~~~~~~2、输出数据! ~~~~~~~~~\n"; cout<<"~~~~~~~3、搜索数据! ~~~~~~~~~\n"; cout<<"~~~~~~~0、退出! ~~~~~~~~~\n"; cout<<"请输入你的选择(输入编号即可): ";cin>>choice; switch(choice) { case1: InputNumber(ob1,ob2);break; case2: OutputNumber(ob1,ob2);break; case3: SearchNumber(ob1,ob2);break; case0: break; default: cout<<"输入有误! ";break; } } } template voidMenu : InputNumber(SeqList { Tnumber; intsign=1,i=0; while(sign)//循环建立有序表 { i++; cout<<"请输入第"< (输入0停止)";cin>>number; if(number==0) { intchoose=1; while(choose) { cout<<"0是否为要输入的数? (1、是;0、不是。 )";cin>>choose; switch(choose) { case1: (number);(number);choose=0;break; case0: sign=0;break; default: cout<<"输入选择有误,请重新选择! "< } /*if(choose==1) { (number);//建立有序表 (number);//建立二叉搜索树 choose=0; } elseif(choose==0) sign=0; else cout<<"输入选择有误,请重新选择! "< */ } } else { (number);//建立有序表 (number);//建立二叉搜索树 } } /*for(intj=0;j<();j++) { number1=(j); (number1);//将建立的顺序表转换为二叉搜索树 }*/ } template voidMenu : OutputNumber(SeqList { intchoose; while(choose) { cout< cout<<"\n=============================\n"; cout<<"|输出选项|\n"; cout<<"=============================\n"; cout<<"|~~~~~~1、顺序表输出! ~~~~~~~|\n"; cout<<"|~~~~~~2、二叉搜索树输出! ~~~|\n"; cout<<"|~~~~~~0、退出! ~~~~~~~~~~|\n"; cout<<"请输入你的选择: ";cin>>choose; switch(choose) { case1: ();break; case2: (cout);break; case0: break; default: cout<<"输入有误! ";break; } } /* if(choose==1) (); elseif(choose==2) (cout); else cout<<"输入有误! "< } template voidMenu : SearchNumber(SeqList { intchoose; Tx; cout<<"请输入你要查找的数: ";cin>>x; while(choose) { cout< cout<<"\n===================================\n"; cout<<"|搜索选项|\n"; cout<<"===================================\n"; cout<<"|~~~~~~~1、顺序表的二分法搜索! ~~~|\n"; cout<<"|~~~~~~~2、二叉搜索树搜索! ~~~~~~~|\n"; cout<<"|~~~~~~~0、退出! ~~~~~~~~~~~~~|\n"; cout<<"请输入你的选择: ";cin>>choose; switch(choose) { case1: (x);break; case2: (x);break; case0: break; default: cout<<"输入有误! ";break; } } } 主函数: #include #include"" usingnamespacestd; intmain() { SeqList BinarySearchTree Menu (ob1,ob2); return0; } (二)、运行结果: 主菜单: 输入数据: 输出数据: 搜索数据: 退出: 六、心得体会 在这次实验中,我收获了很多,对顺序表的认识也加深了一些,基于数组的存储结构还是挺方便的,同时,自己对思维的严谨性有所加强,对程序的容错功能的考虑变多了,而且,对于二叉树结构,也有了一些比较清晰的认识。 当然,在实验中,也有很多不足,写代码时还是不能脱离书本,说明还是不熟悉,掌握不深刻;在写菜单时,由于是用对象作为函数的参数表,却没有用引用,所以每次都会在调试的出错,搞了很久才解决这个问题,以后在空间的申请及释放问题上要下点功夫。 本次实验后,我觉得自己应该常看书,争取以后写代码的时候可以不用书;写代码时也要仔细,认真;同时,要多练习,提高写代码的速度。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 搜索 实验 报告