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

免费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) ;//深度优先遍历

}

. .

hostodo:美国大流量VPS,低至$3,8T流量/月-1.5G内存/1核/25gNVMe/拉斯维加斯+迈阿密

hostodo从2014年年底运作至今一直都是走低价促销侧率运作VPS,在市场上一直都是那种不温不火的品牌知名度,好在坚持了7年都还运作得好好的,站长觉得hostodo还是值得大家在买VPS的时候作为一个候选考虑项的。当前,hostodo有拉斯维加斯和迈阿密两个数据中心的VPS在促销,专门列出了2款VPS给8T流量/月,基于KVM虚拟+NVMe整列,年付送DirectAdmin授权(发ticket...

RackNerd:特价美国服务器促销,高配低价,美国多机房可选择,双E526**+AMD3700+NVMe

racknerd怎么样?racknerd今天发布了几款美国特价独立服务器的促销,本次商家主推高配置的服务器,各个配置给的都比较高,有Intel和AMD两种,硬盘也有NVMe和SSD等多咱组合可以选择,机房目前有夏洛特、洛杉矶、犹他州可以选择,性价比很高,有需要独服的朋友可以看看。点击进入:racknerd官方网站RackNerd暑假独服促销:CPU:双E5-2680v3 (24核心,48线程)内存...

CloudCone2核KVM美国洛杉矶MC机房机房2.89美元/月,美国洛杉矶MC机房KVM虚拟架构2核1.5G内存1Gbps带宽,国外便宜美国VPS七月特价优惠

近日CloudCone发布了七月的特价便宜优惠VPS云服务器产品,KVM虚拟架构,性价比最高的为2核心1.5G内存1Gbps带宽5TB月流量,2.89美元/月,稳定性还是非常不错的,有需要国外便宜VPS云服务器的朋友可以关注一下。CloudCone怎么样?CloudCone服务器好不好?CloudCone值不值得购买?CloudCone是一家成立于2017年的美国服务器提供商,国外实力大厂,自己开...

免费3级域名为你推荐
php虚拟主机如何用虚拟主机建PHP论坛?美国vps服务器美国Vps 哪里的稳定,服务好,不是代购,主要是我新手,不太懂美国主机租用在哪里可以租用美国服务器?虚拟主机代理个人适合代理虚拟主机的业务吗中国域名注册中国十大域名注册商ip代理地址ip代理是什么?虚拟主机申请域名申请以及虚拟主机网站域名空间网站域名和空间深圳网站空间怎样申请免费网站空间虚拟主机系统虚拟主机上的系统与电脑操作系统差别?
域名备案收费吗 linode日本 美国主机网 表单样式 网站保姆 轻量 网站被封 坐公交投2700元 中国电信测网速 metalink 空间租赁 中国电信测速器 东莞主机托管 华为云建站 1美元 阿里云邮箱怎么注册 腾讯服务器 winserver2008下载 卡巴下载 koss耳机 更多