遍历数据结构实验-互联网域名查询实验报告

免费3级域名  时间:2021-01-13  阅读:()

实 验 报 告实验课程数据结构

实验项目实验三互联网域名查询

专 业计算机科学与技术班 级

指导教师

目 录

一、 问题定义及需求分析

1问题描述

2实验任务

3需求分析

二、概要设计

(1)抽象数据类型定义

(2)主程序流程

(3)模块关系

三、详细设计

(1)数据类型及存储结构

(2)模块设计

四、调试分析

(1)调试分析

(2)算法时空分析

(3)经验体会

五、使用说明

(1)程序使用说明

六、测试结果

(1)运行测试结果截图

七、附录

(1)源代码

一、 问题定义及需求分析

1实验目的

互联网域名查询

互联网域名系统是一个典型的树形层次结构。从根节点往下的第一层是顶层域如cn、 com等最底层第四层是叶子结点如www等。因此域名搜索可以看成是树的遍历问题。

2实验任务

设计搜索互联网域名的程序。

3需求分析

1)采用树的孩子兄弟链表等存储结构。

2)创建树形结构。

3)通过深度优先遍历搜索。

4)通过层次优先遍历搜索。

二、概要设计

采用孩子兄弟链表存储结构完成二叉树的创建

主程序流程

创建根节点 域名输入 域名拆分 根据孩子兄弟链表表示的树进行插入 调用层次优先遍历 输出遍历结果 调用深度优先遍历 输出遍历结果 结束程序

模块关系

深度优先遍历输出结果

三、详细设计

孩子兄弟链表结构typedef struct CSNode{

ElemType data[10] ;struct CSNode *f irstchild, *nextsibling;

}*CSTree;

模块一深度优先遍历

算法如下void DFS(CSNode *root) {if ( !root) return;//递归结束条件printf("%s\n", root->data) ;

DFS(root->firstchild) ;//递归遍历孩子节点

DFS(root->nextsibling) ;//递归遍历兄弟节点

}

模块二层次优先遍历

算法如下void BFS(CSNode *root) {printf("层次优先搜索遍历结果为 \n") ;

Queue que;que.Clear() ;que.push(root) ;//根节点入队列while ( !que.empty() ) {//队列不空的时候执行循环

CSNode *xx = que.front() ; //取队首元素qu e.p op() ;//出队列printf("%s\n", xx->data) ;if (xx->nextsibling) {//出队节点的孩子节点若不空则入队列que.push(xx->nextsibling) ;

}if (xx->firstchild) {//同样若孩子节点不空则入队列que.push(xx->firstchild) ;

}

}

}

四、调试分析

问题解决

在编写层次优先遍历算法的时候遍历结果总是不正确原因是取完队首元素后没有将出队列经过改正在取队首元素后加上出队列函数将队首元素出队这样便解决了问题

时空分析经过孩子兄弟链表表示的树创建后便得到一棵二叉树对于两个遍历函数深度优先遍历是递归算法在时间上递归算法效率较低尤其是运算次数较大的时候层次优先遍历函数借助到队列所以在内存占用上较多而深度优先遍历算法的空间占用上更优于层次优先遍历

经验体会

孩子兄弟链表表示的树与二叉树可以相互转化它的深度优先遍历递归算法虽较为简单但相比非递归算法而言效率不高。

五、使用说明

第一步输入域名

第二步完成创建

可编辑第三步输出层次优先遍历结果

第四步输出深度有限遍历结果

六、测试截屏

七、附录

#include <stdio.h>

#include<string.h>

#include<stdlib.h>

#def ine ElemType char

#define QueueSize 50

#def ine push Push

#def ine empty Empty

#define pop Pop

#def ine front Front typedef struct CSNode{

ElemType data[10] ;struct CSNode *f irstchild, *nextsibling;}*CSTree;//节点结构void InitTree(CSNode *A)

{ //构造一个空树

A = (CSTree)malloc(sizeof(CSNode)) ;

A->f irstchild = A->nextsibling =NULL;

}int Search_(CSNode *X, char *a)

{ //查找待插入的节点在树中是否存在

CSNo de *B;

B = X;//B指向根节点while (B->data)

{if (strcmp(B->data, a) == 0)

{

X = B; //若存在相等的则返回1return 1;

}else

{

B = B->nextsibling; //否则B指向它的兄弟节点

}

}return 0;

}void hanshu1(CSNode *A, ElemType *s)

{//将节点插入到树中

CSNo de *B, *X;char *s tr;int i;

X = A; //X指向根节点

B = (CSTree)malloc(sizeof(CSNode)) ;

B->f irstchild = B->nextsibling =NULL;c har ZhongZhuan[15] ; //中转数组f or (; s != ' \0' ;)

{

//zhongzhuan接受s中xxx.部分或取完翻转zhongzhuan str = strchr(s, ' . ' ) ;//返回字符串s中第一次出现点的位置if (str)

{i = str - s;

ZhongZhuan[i + 1] = '\0' ;f or (; i >= 0; i--, s++)

{

ZhongZhuan[i] = s[0] ;//将拆分后的节点传入中转数组中}

}

可编辑else

{//字符串中不含点符号

_strrev(s) ;i = strlen(s) ;

ZhongZhuan[i + 1] = '\0' ;f or (; i >= 0; i--)

{

ZhongZhuan[i] = s[i] ;//将字符串存入中转数组里

}i f (Search_(X, ZhongZhuan))

{//若要插入的字符串已存在该层面上

X = X->firstchild;//x指向孩子节点cont inue;

}i f (X->data[0] == '0' )

{s trcpy(X->data, ZhongZhuan) ;//将中转数组的信息复制给待插入节点B = (CSTree)malloc(sizeof(CSNode)) ;

B->f irstchild = B->nextsibling =NULL;

}else

{if (X->firstchild)

{strcpy(B->data, ZhongZhuan) ;

X->nextsibling = B;//将作为的兄弟节点

B = (CSTree)malloc(sizeof(CSNode)) ;

B->f irstchild = B->nextsibling =NULL;

X = X->nextsibling; //x指向它的兄弟节点

}else

{strcpy(B->data, ZhongZhuan) ;

X->firstchild = B;

B = (CSTree)malloc(sizeof(CSNode)) ;

B->f irstchild = B->nextsibling =NULL;

X = X->firstchild;

}

}

}

}

可编辑struct Queue {int Top, Tail ;

CSNo de *a[1000] ;void Clear() ;void Push(CSNode *e) ;void Pop() ;

CSNode *Front() ;bool Empty() ;

} ;//队列封装为结构体void Queue: :Clear() {

Top = Tail = 0;return;

}//清空队列void Queue: :Push(CSNode *e) {a[Ta i l++] = e;return;

}//入队列void Queue: :Pop() {

Top++;return;

}//出队列

CSNode *Queue: :Front() {return a[Top] ;

}//取队首元素bool Queue: :Empty() {return Top == Tail;

}//判空void BFS(CSNode *root) {printf("层次优先搜索遍历结果为 \n") ;

Queue que;que.Clear() ;que.push(root) ;//根节点入队列while ( !que.empty() ) {//队列不空的时候执行循环

CSNode *xx = que.front() ; //取队首元素qu e.p op() ;//出队列printf("%s\n", xx->data) ;if (xx->nextsibling) {//出队节点的孩子节点若不空则入队列que.push(xx->nextsibling) ;

}if (xx->firstchild) {//同样若孩子节点不空则入队列que.push(xx->firstchild) ;

}

}

}void DFS(CSNode *root) {if ( !root) return;//递归结束条件printf("%s\n", root->data) ;

DFS(root->firstchild) ;//递归遍历孩子节点

DFS(root->nextsibling) ;//递归遍历兄弟节点

}int main()

{int j;

CSNode *A;

A = (CSNode*)mal loc(si zeof(CSNode) ) ;//根节点创建A->f irstchild = A->nextsibling =NULL;

A->data[0] = '0' ;char b[30] ; //定义字符数组接收域名c har *s;f or (j = 0; j<3; j++)

{printf("请输入网址 ") ;gets(b) ;s = b;//s指向数组b

_strrev(s) ;h an s hu 1 (A, s) ;//字符串s存入A中

}

BFS(A) ;//层次优先遍历printf("深度优先遍历结果为:\n") ;

DFS(A) ;//深度优先遍历

}

. .

atcloud:480G超高防御VPS低至$4/月,美国/新加坡等6机房,512m内存/1核/500g硬盘/不限流量

atcloud主要提供常规cloud(VPS)和storage(大硬盘存储)系列VPS,其数据中心分布在美国(俄勒冈、弗吉尼亚)、加拿大、英国、法国、德国、新加坡,所有VPS默认提供480Gbps的超高DDoS防御+不限流量,杜绝DDoS攻击骚扰,比较适合海外建站等相关业务。ATCLOUD.NET是一家成立于2020年的海外主机商,主要提供KVM架构的VPS产品、LXC容器化产品、权威DNS智能解...

hostkey荷兰/俄罗斯机房,GPU服务器

hostkey应该不用说大家都是比较熟悉的荷兰服务器品牌商家,主打荷兰、俄罗斯机房的独立服务器,包括常规服务器、AMD和Intel I9高频服务器、GPU服务器、高防服务器;当然,美国服务器也有,在纽约机房!官方网站:https://hostkey.com/gpu-dedicated-servers/比特币、信用卡、PayPal、支付宝、webmoney都可以付款!CPU类型AMD Ryzen9 ...

Virtono:€23.7/年,KVM-2GB/25GB/2TB/洛杉矶&达拉斯&纽约&罗马尼亚等

Virtono最近推出了夏季促销活动,为月付、季付、半年付等提供9折优惠码,年付已直接5折,而且下单后在LET回复订单号还能获得双倍内存,不限制付款周期。这是一家成立于2014年的国外VPS主机商,提供VPS和服务器租用等产品,商家支持PayPal、信用卡、支付宝等国内外付款方式,可选数据中心包括罗马尼亚、美国洛杉矶、达拉斯、迈阿密、英国和德国等。下面列出几款VPS主机配置信息,请留意,下列配置中...

免费3级域名为你推荐
买虚拟主机购买虚拟主机时,应该注意点什么呢,...?linux主机linux主机与Windows主机的区别?谢谢海外域名什么叫海外域名?php虚拟空间怎样修改php虚拟空间单个文件上传大小限制网站空间购买国内网站空间购买哪里的比较实惠啊?100m网站空间网站空间100M和1000M有什么区别 ?免备案虚拟主机请问哪里好一点的免备案的虚拟主机?什么是虚拟主机什么是“虚拟主机”?请解释祥细些!虚拟主机管理系统如何用win虚拟主机管理系统搭建apache虚拟主机apache里面可以在虚拟主机里边设置虚拟目录吗?急,在线等!
汉邦高科域名申请 火山主机 net主机 smartvps flashfxp怎么用 locvps lunarpages 美国主机推荐 密码泄露 777te 双拼域名 bgp双线 国外代理服务器软件 tna官网 美国堪萨斯 上海服务器 常州联通宽带 网通服务器 服务器论坛 广东主机托管 更多