




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实习题目:利用树型结构的搜索算法模拟因特网域名的查询学院:计算机与通信工程学院 姓名: 班级: 通信1103 学号: 指导教师: 黄旗明 一、问题描述在Internet的域名系统中,以树型结构实现域名的搜索。即输入某站点的域名,在域名系统的树型结构中进行搜索,直至域名全部匹配成功或匹配失败;若成功则给出该站点的IP地址。二、测试数据可以取常用到的著名站点的域名和IP 地址为例构建域名结构的树,一般应有个左右的站点域名。当输入时,输出为“”;而输入时,输出应为“找不到服务器或发生DNS错误”。三、实现提示树的存储结构采用孩子兄弟链表。二叉链表的树结构是一种动态结构,除第一次生成的过程需要人工输入数据外,以后每次进行搜索查询大,应首先从文件中保存是数据自动生成树结构。为解决二叉链表与文件之间的转换,可以通过先序遍历的办法保存和恢复二叉链表。例如一个二叉链表的文件保存形式如下:四、问题讨论实际的使用中,树结构的使用机会比二叉树还要多,一般情况下都采用孩子兄弟链表作树的存储结构,此时也可将树视作二叉树,并将对树进行的操作转换成对二叉树的相应操作。五、实际设计及具体代码1、创建题头文件binTree#include using namespace std;class treeNode/结点类public: treeNode():data(NULL),left(NULL),right(NULL) treeNode(char* dat):data(dat),left(NULL),right(NULL) char* data;/数据格式 www或.taobao 或者 treeNode* left; treeNode* right;class binTree/IP二叉树,孩子兄弟表示法,函数bool返回时TRUE凡是成功,否则失败public:/外部函数接口 binTree():initalFlag(false) bool Initialize();/从IP数据库读取数据,并形成IP二叉树,IP数据在倒数第二结点的左孩子里面 char* searchIP(string website);/查找IP,参数为网站名称,例如: void edit(string IP,string websiteWithoutIP);/查找是否存在该网站,否则不进行编辑 bool addNew(string input);/先验证输入是否正确,然后添加新网站和其IP到二叉树和数据库 void destory() destoryNodes(root); binTree() bool initalFlag;private:/内部封装函数和成员 void addNewWebsite(string website);/添加新数据到二叉树,参数为带IP的网址名称,例如:/ bool writeToFile(string websiteWithIP);/将带IP地址的网址名称写入文件尾部 bool editIP(string IP,char*& dataPointer,string websiteWithoutIP);/编辑存在网站的IP数据,参数分别是IP,指向IP的指针,和该网站的名称 treeNode* insertNode(treeNode*& head,const char* data);/向HEAD所指向指针的孩子区添加内容为data的结点,如果存在则不添加 void spiltWebsite(string& website,string* IPaddress,string* domain);/将带有IP网站数据分成IP数据,和各个小结点例如:/分成到IPADDRESS和www,.taobao,.com到domain string 数组 treeNode* searchParts(const char* part,treeNode* level,char*& lastPointer);/查找PART所指向的数据,(.com),level为该数据所在的层级,lastpointer当涉及孩子结点的ip数据时,才赋值,一般为null bool checkStringFormat(string toBeChecked,bool whetherHasIP,bool IPpart);/检查string数据是否符合IP格式或网站名称或带IP的网站名称 void destoryNodes(treeNode*& current);/删除二叉树所有结点以及数据 treeNode* root;/根结点,不附加内容。左结点指向IP二叉树;bool binTree:Initialize() root=new treeNode; root-data=new char11; strcpy(root-data,SystemHead); fstream manipulate; string website; char buffer100; manipulate.open(IPDB.txt,ios:in); if (manipulate.is_open() while (!manipulate.eof() manipulate.getline(buffer,100,n); website=buffer; addNewWebsite(website); manipulate.close(); initalFlag=true; return true; else coutFail to load data to read.endl; manipulate.close(); initalFlag=false; return false; bool binTree:addNew(string input) if (checkStringFormat(input,true,NULL) addNewWebsite(input); return writeToFile(input); else coutFail to addinputendl; return false; bool binTree:writeToFile(string websiteWithIP) fstream writeFile(IPDB.txt,ios:out|ios:app); if (writeFile.is_open() const char* toBeSaved=websiteWithIP.c_str(); writeFile.write(toBeSaved,strlen(toBeSaved)*sizeof(char); writeFileendl;/不要忘记n writeFile.close(); return true; else writeFile.close(); coutCant open the file to write.endl; return false; char* binTree:searchIP(string website) string domain4; const char* parts4; spiltWebsite(website,NULL,domain); for (int i=0;i4;+i) partsi=domaini.c_str(); int count=strlen(parts3)?4:3; bool flag; char* lastPointer=null; treeNode* temp=root; while (count-) temp=searchParts(partscount,temp,lastPointer); if (temp=NULL) return NULL; return lastPointer;void binTree:edit(string IP,string websiteWithoutIP) char * data=NULL; data=searchIP(websiteWithoutIP); if (data!=NULL & editIP(IP,data,websiteWithoutIP) return; cout无该网站,无法编辑或者格式错误=0;-i) const char* temp=domaini.c_str(); current=insertNode(current,temp); char* content=new charIPaddress.length()+1; for ( i=0;ileft=new treeNode(content);treeNode* binTree:insertNode(treeNode*& head,const char* data) treeNode* child=head; if (child-left!=NULL)/左孩子为空表示head下面没有数据 child=child-left;/如果存在,则查找head的所有孩子 if (!strcmp(child-data,data)/比较字符串数据,匹配成功返回0,所以!0=1 return child; while (child-right!=NULL & strcmp(child-right-data,data)/不匹配继续查找 child=child-right; if (child-right = NULL)/查找失败,则新建 child-right=new treeNode; child-right-data=new charstrlen(data)+1; strcpy(child-right-data,data); return child-right; else return child-right; else child-left=new treeNode; child-left-data=new charstrlen(data)+1; strcpy(child-left-data,data); return child-left; void binTree:spiltWebsite(string& website,string* IPaddress,string* domain) int position=website.find_first_of(/); string ip; if (position!=-1)/防止多余的空格导致错误 ip=website.substr(position+1,website.length()-position);/IPADDRESS website.erase(position,ip.length()+1);/删除IP地址部分 if (IPaddress!=NULL) /IP地址 *IPaddress=ip; /下面还是分组website int count=0; int j=0;/i means begin and j means the end unsigned int i=j; while (1) for (;ileft; if (current=NULL) return NULL; while (strcmp(current-data,part) & current-right!=NULL ) current=current-right; if (!strcmp(current-data,part) if (lastPointer!=NULL) for (int i=0;idata);+i) if (current-datai=.) return current; lastPointer=current-left-data; return current; return NULL;bool binTree:checkStringFormat(string toBeChecked,bool whetherHasIP,bool IPpart) if (!whetherHasIP) if (toBeChecked0=.|toBeCheckedtoBeChecked.length()-1=.) return false; for (int i=1;ileft!=NULL) destoryNodes(current-left); if (current-right!=NULL) destoryNodes(current-right); if (current-data!=NULL) delete current-data; delete current;bool binTree:editIP(string IP,char*& dataPointer,string websiteWithoutIP) if (checkStringFormat(IP,false,true) delete dataPointer;/编辑就是先把原来的先删除了再创建新的 dataPointer=new charIP.length()+1; strcpy(dataPointer,IP.c_str(); string fullWebsite=websiteWithoutIP+/+IP; writeToFile(fullWebsite); return true; else return false; 2、编写主函数代码#include #include #include #include binTree.husing namespace std;int main() binTree domainTree; const char str=1.IP二叉树初始化 2.查找IP 3.添加新数据 4.编辑IP 5.销毁二叉树 6.退出程序 ; string websiteWithoutIP,websiteWithIP,newIP; char whetherDestory; bool result; char* output; while (true) coutstroption; switch (option) case 1: if (!domainTree.initalFlag) result=domainTree.Initialize(); if (result=false) cout找不到服务器或者DNS错误endl; else cout找不到服务器或者DNS错误endl; break; case 2: if (domainTree.initalFlag) cout请输入网址,例如: websiteWithoutIP; output=domainTree.searchIP(websiteWithoutIP); if (output!=NULL) coutoutputendl; else cout找不到服务器或者DNS错误endl; else cout找不到服务器或者DNS错误endl; break; case 3: if (domainTree.initalFlag) cout请输入网址和IP,例如: /websiteWithIP; result=domainTree.addNew(websiteWithI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年初中地理特岗教师招聘考试模拟题及备考策略
- 重点护理环节管理措施
- 甲状腺素合成课件
- 甲状腺相关课件获取
- 中国的民族教学课件
- 《飞机梦工厂》教学课件
- 江苏苏州2018-2022年中考满分作文65篇
- 用电设备安全知识培训课件
- 统编版小学二年级语文(上)第六单元测试题(含答案)
- 中外教育简史教学课件
- GB 16808-2025可燃气体报警控制器
- 医疗机构重点部门感染预防与控制标准WST860-2025解读宣贯
- 2025至2030中国制造仿真软件行业项目调研及市场前景预测评估报告
- 心血管内科医师执业考试题库
- 2025年汽车后市场行业当前市场规模及未来五到十年发展趋势报告
- 2025当兵心理测试题及答案
- 2025年官方兽医牧运通考试题库附参考答案详解(考试直接用)
- 退伍留疆考试题库及答案
- 2025年兵团辅警考试题库
- 2025年湖南省直机关遴选公务员考试笔试试卷【附答案】
- 家电广告效果评估报告
评论
0/150
提交评论