【问题描述】

以树形结构实现域名的搜索,即输入某站点的域名,在域名系统的树形结构中进行搜索,直至域名全部全部匹配成功或者匹配失败,若成功则给出该节点的IP地址,否则给出找不到该节点信息。

【基本要求】

首先实现一个反映域名结构的树,如清华大学站点为www.tsinghua.edu.cn,在该树从根到叶子的各层节点就应该是root、cn、edu、tsinghua、www。叶子结点www另有一个数据域,存放清华大学站点的IP地址166.111.9.2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct app {char a[20];struct app *left;struct app *right;char b[20];
} app;
int cout = 0;
/*建树时用到的数据:com baidu www 220.181.27.5 # # google www 66.249.89.104 # #microsoft www 207.46.20.60 # # # gov whitehouse www 64.215.166.127 # #nasa www 210.254.57.56 # # # cn com lenovo www 219.239.195.11 # #sina www 218.30.13.51 # # # edu ustc www 202.38.64.2 # bbs 202.38.64.3 # #pku www 162.105.129.12 # bbs 162.105.204.150 # # tsinghua www 166.111.4.100 #ftp 166.111.8.229 # # # gov beijing www 210.73.64.10 # #shanghai www 61.129.65.58 # # # # #
*///数据保存在相同目录下的text.txt文件下;
app *jianshu(app *bt, FILE *fp) {char a[20];if (fscanf(fp, "%s ", &a) != EOF) {if (a[0] == '#')bt = NULL;else {bt = (app *)malloc(sizeof(app));strcpy(bt->a, a);if (strcmp(a, "www") == 0 || strcmp(a, "bbs") == 0 || strcmp(a, "ftp") == 0 ) {fscanf(fp, "%s ", &a);strcpy(bt->b, a);}bt->left = jianshu(bt->left, fp);bt->right = jianshu(bt->right, fp);}}return bt;
}app *tianjia(app *bt, char fenge[4][20], int i, char ip[20]) {/*puts(fenge[i]);puts(bt->a);printf("%d", i);*/if (bt != NULL && strcmp(bt->a, fenge[i]) == 0) {if (i == 0) {puts(bt->b);return bt;}bt->left = tianjia(bt->left, fenge, --i, ip);} else {if (bt == NULL) {if (i == -1) {return bt;}bt = (app *)malloc(sizeof(app));bt->right = NULL;bt->left = NULL;strcpy(bt->a, fenge[i]);if (strcmp(fenge[i], "www") == 0 || strcmp(fenge[i], "bbs") == 0 || strcmp(fenge[i], "ftp") == 0 ) {strcpy(bt->b, ip);}bt->left = tianjia(bt->left, fenge, --i, ip);} elsebt->right = tianjia(bt->right, fenge, i, ip);}return bt;
}void qianxu(app *bt, FILE *fp) {if (bt == NULL) {fprintf(fp, "# ");} else {fprintf(fp, "%s ", bt->a);if (strcmp(bt->a, "www") == 0 || strcmp(bt->a, "bbs") == 0 || strcmp(bt->a, "ftp") == 0 ) {fprintf(fp, "%s ", bt->b);}qianxu(bt->left, fp);qianxu(bt->right, fp);}
}void jiediangeshu(app *bt, char fenge[4][20], int i) {/*for (i; i >= 0; i--) {puts(fenge[i]);}*///puts(bt->a);//puts(fenge[i]);if (bt != NULL && strcmp(bt->a, fenge[i]) == 0) {if (i == 0) {puts(bt->b);return;}jiediangeshu(bt->left, fenge, --i);} else {if (bt == NULL) {printf("找不到服务器或发生 DNS 错误");return;}jiediangeshu(bt->right, fenge, i);}
}int main() {printf("欢迎使用IP查询!\n");char str[80];char ip[20];char *token;char ju = 'y';int xuan;char fenge[4][20];int flag = 0;app *bt;FILE *fp1 = NULL;FILE *fp2 = NULL;fp1 = fopen("text.txt", "r");bt = jianshu(bt, fp1);fp2 = fopen("text.txt", "w");//qianxu(bt);while (ju != 'n') {printf("请选择功能:1,增加网址;2,查询网址;3,退出系统\n");scanf("%d", &xuan);getchar();if (xuan == 3) {qianxu(bt, fp2);exit(0);}printf("请输入地址:");scanf("%s", &str);getchar();int i = 0;token = strtok(str, ".");while (token != NULL) {strcpy(fenge[i], token);i++;token = strtok(NULL, ".");}switch (xuan) {case 1:printf("请输入ip:");scanf("%s", &ip);getchar();bt = tianjia(bt, fenge, --i, ip);break;case 2:jiediangeshu(bt, fenge, --i);break;}printf("是否继续?y/n\n");scanf("%c", &ju);//qianxu(bt, fp2);getchar();}qianxu(bt, fp2);fclose(fp2);fclose(fp1);printf("谢谢使用");
}
/*
测试数据
www.baidu.com 220.181.27.5
www.google.com 66.249.89.104
www.microsoft.com 207.46.20.60
www.whitehouse.gov 64.215.166.127
www.nasa.gov 210.254.57.56
www.lenovo.com.cn 219.239.195.11
www.sina.com.cn 218.30.13.51
www.ustc.edu.cn 202.38.64.2
bbs.ustc.edu.cn 202.38.64.3
www.pku.edu.cn 162.105.129.12
bbs.pku.edu.cn 162.105.204.150
www.tsinghua.edu.cn 166.111.4.100
ftp.tsinghua.edu.cn 166.111.8.229
www.beijing.gov.cn 210.73.64.10
www.shanghai.gov.cn 61.129.65.58
*/


二叉树结构如图

利用树形结构的搜索算法实现模拟因特网域名的查询相关推荐

  1. vue树形结构html,怎么在vue中利用递归组件实现一个树形控件

    怎么在vue中利用递归组件实现一个树形控件 发布时间:2021-06-11 17:26:48 来源:亿速云 阅读:81 作者:Leah 本篇文章为大家展示了怎么在vue中利用递归组件实现一个树形控件, ...

  2. 利用Stram来递归生成树形结构

    利用Stram来递归生成树形结构 当需要查询有子菜单,或者子部门这一类需要形成树形的数据时,我们可以使用stream流式编程写 实体类 实体类需要有一个子列,类似此处的子城市 @Data @Equal ...

  3. 树形结构递归_递归和匿名函数

    戳上面的蓝字关注我,有干货哦! ❝ 编程语言中,函数Func(Type a,--)直接或间接调用函数本身,则该函数称为递归函数. ❞ 模拟实现树形结构的遍历 比如:我要遍历下图sublime_pyth ...

  4. Java后端递归构建树形结构

    记录:在Java后台利用递归思路进行构建树形结构数据,返回给前端,能以下拉菜单等形式进行展示. 简明:为了简化代码,引入Lombok的Jar包,可省略实体类set().get()方法. <dep ...

  5. java构建树形结构

    目录 前言 实现树形结构 一.树节点数据类(反回参数类) 二.给树形结构添加数据 三.测试类 四.测试结果 前言 在我们实际开发中会接触到树形结构,根节点子节点, 然后添加数据构成了我们的树形结构, ...

  6. html树状结构怎么展开,纯css实现树形结构

    纯css实现属性结构 **css实现属性结构的思路是利用伪类实现树形结构连接线,如果想实现点击展开和收 缩以及复选框效果还得配合js来实现.其实展开和收缩就是一个点击元素其子元素隐藏 和显示的切换.* ...

  7. Java8 Stream流递归,几行代码搞定遍历树形结构

    欢迎关注方志朋的博客,回复"666"获面试宝典 可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中 ...

  8. 浅谈树形结构的特性和应用(上):多叉树,红黑树,堆,Trie树,B树,B+树......

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 上篇文章我们主要介绍了线性数据结构,本篇233酱带大家看看 无所不 ...

  9. vue 递归组件多级_Vue递归组件实现树形结构菜单

    Tree 组件是递归类组件的典型代表,它常用于文件夹.组织架构.生物分类.国家地区等等,世间万物的大多数结构都是树形结构.使用树控件可以完整展现其中的层级关系,并具有展开收起选择等交互功能. 如图所示 ...

最新文章

  1. python提高照片分辨率怎么调_实拍16张菊花特写照片,运用暗色调表现,其质感表现得怎么样?...
  2. R语言dplyr包获取dataframe分组聚合汇总统计值实战(group_by() and summarize() ):均值、中位数、分位数、IQR、MAD、count、unique
  3. BLDC(无刷直流电机)应用相关
  4. Python工程师必看的面试问题与解答(中)
  5. nodejs async await promise理解
  6. 集合源码(一)之hashMap、ArrayList
  7. 删除链表中重复的节点
  8. 带动量的随机梯度下降法_梯度下降法(SGD)原理解析及其改进优化算法
  9. spring的新注解
  10. 万年历c语言代码3000年,求万年历代码!
  11. PB系统连接原生数据库DB文件
  12. L2TP/IPSec一键安装脚本
  13. WPS国际版2019 中文
  14. 微信朋友圈怎么发GIF
  15. xp无线网卡开启的服务器,无线网卡在 Windows XP 系统下的安装与使用过程
  16. 时间复杂性为O (n2),是什么意思
  17. Python 正则表达式(RegEx)
  18. javascript学习网站
  19. 【愚公系列】2022年01月 Java教学课程 53-Stream字节读取与写入
  20. 记一次m3u8文件转mp4的经历

热门文章

  1. Android中解压zip中文乱码处理
  2. [转]轻松理解MYSQL MVCC 实现机制
  3. 使用Beaglebone Black的PRU(一)
  4. 手机号3-4-4 滚动函数 滚盘抽奖
  5. Python scapy抓取网卡中的数据包
  6. 基于Java毕业设计贝儿米幼儿教育管理系统源码+系统+mysql+lw文档+部署软件
  7. 【追寻javascript高手之路01】javascript参数知多少? - 叶小钗
  8. springBoot热部署+HTML页面热部署
  9. 利用java创建文件或者文件夹
  10. 视觉-相机、镜头选择