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

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

}

. .

数脉科技香港物理机 E3 16G 10M 华为线路165元 阿里云线路 188元 Cera线路 157元

2021年9月中秋特惠优惠促销来源:数脉科技 编辑:数脉科技编辑部 发布时间:2021-09-11 03:31尊敬的新老客户:9月优惠促销信息如下,10Mbps、 30Mbps、 50Mbps、100Mbps香港优质或BGPN2、阿里云线路、华为云线路,满足多种项目需求!支持测试。全部线路首月五折起。数脉官网 https://my.shuhost.com/香港特价数脉阿里云华为云 10MbpsCN...

Hostodo(年付12美元),美西斯波坎机房Linux VPS主机66折

Hostodo 商家是比较小众的国外VPS主机商,这不看到商家有推送促销优惠在美国西岸的斯波坎机房还有少部分库存准备通过低价格促销,年付低至12美元Linux VPS主机,且如果是1GB内存方案的可以享受六六折优惠,均是采用KVM架构,且可以支付宝付款。第一、商家优惠码优惠码:spokanessd 1GB+内存方案才可以用到优惠码,其他都是固定的优惠低至年12美元。第二、商家促销这里,我们可以看到...

CloudCone(20美元/年)大硬盘VPS云服务器,KVM虚拟架构,1核心1G内存1Gbps带宽

近日CloudCone商家对旗下的大硬盘VPS云服务器进行了少量库存补货,也是悄悄推送了一批便宜VPS云服务器产品,此前较受欢迎的特价20美元/年、1核心1G内存1Gbps带宽的VPS云服务器也有少量库存,有需要美国便宜大硬盘VPS云服务器的朋友可以关注一下。CloudCone怎么样?CloudCone服务器好不好?CloudCone值不值得购买?CloudCone是一家成立于2017年的美国服务...

免费3级域名为你推荐
vpsvps和服务器哪个比较划算asp主机空间asp空间是什么me域名me域名怎么样?网站空间购买国内网站空间购买哪里的比较实惠啊?香港虚拟主机香港的虚拟主机好不好,如何选择虚拟主机?什么是虚拟主机虚拟主机是什么1g虚拟主机1G虚拟空间大约多少钱?虚拟主机服务商哪个虚拟主机的服务商比较好?论坛虚拟主机最近想买虚拟主机,用来做论坛。论坛虚拟主机我想买个论坛虚拟主机,但是去了好多网站都不怎么样?
台湾服务器租用 免费域名申请 西安服务器 12306抢票攻略 最好的空间 刀片式服务器 免费智能解析 hdd 支持外链的相册 四川电信商城 阿里云免费邮箱 wordpress中文主题 双线空间 稳定空间 测试网速命令 江苏徐州移动 阵亡将士纪念日 乐视会员免费领取 云销售系统 hdroad 更多