排序与查找及其应用:设计一个程序,用于查询一个IP所在的机构设计一个程序,用于查询一个IP所在的机构

问题描述

排序与查找及其应用:设计一个程序,用于查询一个IP所在的机构设计一个程序,用于查询一个IP所在的机构

设计一个程序,用于查询一个IP所在的机构。具体要求:1. 设计一个函数,用于比较两个IP地址(字符串)的大小,
2. 从外部数据文件(IP.TXT)中读取IP数据;
3. 用平衡二叉排序树存储IP及其所属机构名称;4. 输入一个IP地址,查找并输出与此IP对应的机构名称;
5. 输入一个机构名称,查询与此机构对应的的IP地址;

解决方案

算法部分可以使用STL。

解决方案二:

#include //printf,scanf
#include //malloc
#include //getch

#define FALSE 0
#define TRUE 1
#define NULL 0
#define LH 1 //左高
#define EH 0 //等高
#define RH -1 //右高

typedef int KeyType;
typedef int Status;

typedef struct{
KeyType key; //按key字段排序
char s[10]; //另一字段,空着未用
}ElemType;

typedef struct BBSTNode{ //二叉平衡排序树
ElemType data; //数据元素
int bf; //平衡因子
struct BBSTNode *lchild,*rchild; //左右孩子
}BBSNode,*BBSTree; //结点及结点指针

Status Delete(BBSTree &);
void LeftBalance(BBSTree &);
void RightBalance(BBSTree &);
void R_Rotate(BBSTree &p);
void L_Rotate(BBSTree &p);

Status EQ(KeyType a,KeyType b)
{
if(a==b)return TRUE;
else return FALSE;
}

Status LT(KeyType a,KeyType b)
{
if(a<b)return TRUE;
else return FALSE;
}

Status SearchBBST(BBSTree T,KeyType key,BBSTree f,BBSTree &p)
{
if(!T) {p=f;return FALSE;}
else if (EQ(key,T->data.key)) {p=T;return TRUE;}
else if (LT(key,T->data.key)) return SearchBBST(T->lchild,key,T,p);
else return SearchBBST(T->rchild,key,T,p);

}

Status InsertBBST(BBSTree &T, ElemType e)
{
BBSTree p,s;
if(!SearchBBST(T,e.key,NULL,p))
{
s=(BBSTree)malloc(sizeof(BBSNode));
s->data=e;s->lchild=s->rchild=NULL;
if(!p)T=s;
else if (LT(e.key,p->data.key)) p->lchild=s;
else p->rchild=s;
return TRUE;
}
else return FALSE;
}
Status OTFSearch(BBSTree T,KeyType key,int &cnt) //仅用于查找,同时统计出查找次数
{ //在二叉排序树T中查找key
if(!T){return FALSE;} //查找不成功
else if(EQ(key,T->data.key)){cnt++;return TRUE;}//查找成功
else if(LT(key,T->data.key))
return OTFSearch(T->lchild,key,++cnt); //在左子树中继续查找
else return OTFSearch(T->rchild,key,++cnt); //在右子树中继续查找
}

Status DeleteBBST(BBSTree &T, KeyType key) //此算法自己完成,参见//algorithm9.7

{
if(!T)return FALSE;
else {
if (EQ(key,T->data.key)){return Delete(T);}
else if(LT(key,T->data.key))return DeleteBBST(T->lchild,key);
else return DeleteBBST(T->rchild,key);
}
}

Status Delete(BBSTree &p)//此算法自己完成,参见algorithm9.8 //程序中出现的delete s;相当于C中的free(s);

{
BBSTree q,s;
if(!p->rchild){q=p;p=p->lchild;free(q);}
else if(!p->lchild){q=p;p=p->rchild;free(q);}
else{
q=p;s=p->lchild;
while(s->rchild){q=s;s=s->rchild;}
p->data=s->data;
if(q!=p)q->rchild=s->lchild;
else q->lchild=s->lchild;
delete s;
}
return TRUE;
}

Status InsertAVL(BBSTree &T,ElemType e,int &taller) //此算法自己完成,参见algorithm9.11 (开始点1)
{

if(!T){
T=(BBSTree) malloc(sizeof(BBSNode)); T->data=e;
T->lchild=T->rchild=NULL; T->bf=EH;taller=TRUE;
}
else
{
if(EQ(e.key,T->data.key))
{taller=FALSE;return 0;}
if(LT(e.key,T->data.key))
{
if(!InsertAVL(T->lchild,e,taller)) return 0;
if(taller)
switch(T->bf)
{
case LH:
LeftBalance(T);taller=FALSE;break;
case EH:
T->bf=LH;taller=TRUE;break;
case RH:
T->bf=EH;taller=FALSE;break;
}
}
else
{
if(!InsertAVL(T->rchild,e,taller))return 0;
if(taller)
switch(T->bf)
{
case LH:
T->bf=EH;taller=FALSE;break;
case EH:
T->bf=RH;taller=TRUE;break;
case RH:
RightBalance(T);taller=FALSE;break;
}
}
}
return 1;
}

void LeftBalance(BBSTree &T)//此算法自己完成,参见algorithm9.12 (2)
{
BBSTree rd,lc;

lc=T->lchild;
switch(lc->bf)
{
case LH:
T->bf=lc->bf=EH;
R_Rotate(T);break;
case RH:
rd=lc->rchild;
switch(rd->bf){
case LH:T->bf=RH;lc->bf=EH;break;
case EH:T->bf=lc->bf=EH;break;
case RH:T->bf=EH;lc->bf=LH;break;
}
rd->bf=EH;
L_Rotate(T->lchild);
R_Rotate(T);
}
}

void RightBalance(BBSTree &T) //T所指结点为根的二叉树作做右平衡旋转,结束时指针T指向新的根节点;
{
BBSTree rc,ld;

rc=T->rchild; //rc指向*T的右子树根结点
switch(rc->bf){ //检查*T的右子树平衡度,并作相应的平衡处理
case RH: //新结点插入在*T的右孩子的右子树上,要做单右旋处理
T->bf=rc->bf=EH;
L_Rotate(T);
break;
case LH: //新结点插入在*T的右孩子的左子树上,要做双旋处理
ld=rc->lchild; //rd指向*T的右孩子的左子树根
switch(ld->bf){ //修改*T及其右孩子的平衡因子
case LH:T->bf=LH;rc->bf=EH;break;
case EH:T->bf=rc->bf=EH;break;
case RH:T->bf=EH;rc->bf=RH;break;
}
ld->bf=EH;
R_Rotate(T->rchild); //对*T的右孩子做右旋平衡处理
L_Rotate(T); //对*T做左旋处理
}
}

void R_Rotate(BBSTree &p) //此算法自己完成,参见algorithm9.9 (3)
{
BBSTree lc;
lc=p->lchild;
p->lchild=lc->rchild;
lc->rchild=p;p=lc;

}

void L_Rotate(BBSTree &p)//此算法自己完成,参见algorithm9.10 (4)
{
BBSTree rc;
rc=p->rchild;
p->rchild=rc->lchild;
rc->lchild=p;p=rc;

}

void BBSTPrintMessage(BBSTree T) //输出值及平衡因子
{
if(T){
if(T->lchild)BBSTPrintMessage(T->lchild);
printf("%-5d%-5dn",T->data.key,T->bf);
if(T->rchild)BBSTPrintMessage(T->rchild);
}
}

void BBSTPrintTree(BBSTree p,int n) //按树形输出值
{
if(p!=NULL){
if(p->rchild)BBSTPrintTree(p->rchild,n+1);
for(int i=0;i
printf("-->%dn",p->data.key);
if(p->lchild)BBSTPrintTree(p->lchild,n+1);
}
}

void InitBBST(BBSTree &T) //初始化二叉平衡排序树BBST
{
T=NULL;
}

void CreatBBST(BBSTree &T,int n) //创建具有n个结点的BBS树
{
int i,taller=0;
ElemType e;
for(i=0;i<n;i++){
e.key=i+1; //取1到n的整数
InsertAVL(T,e,taller);
}
}

void DestroyBBST(BBSTree &T) //销毁二叉平衡排序树BBST
{
BBSTree lc,rc;
if(T){
lc=T->lchild;rc=T->rchild;
if(T->lchild)DestroyBBST(lc);
if(T->rchild)DestroyBBST(rc);
free(T);
T=NULL;
}
}

void main()
{
int n; //树的总结点数
BBSTree T; //存放树根结点
KeyType key; //存放待查找的关键字
int cnt=0; //用于统计查找次数
InitBBST(T); //初始化二叉平衡树BBST
printf("n输入结点数n=");
scanf("%d",&n);
CreatBBST(T,n); //创建具有15个结点值为1至15的BBST
BBSTPrintMessage(T); //显示BBST的结点元素值及平衡因子
BBSTPrintTree(T,0); //以树形显示BBST
printf("n输入待查关键字key=:");
scanf("%d",&key); //输入要查找的关键字
if(OTFSearch(T,key,cnt)) //若找到,显示关键字及查找次数
printf("n找到%d用%d次!n",key,cnt);
else printf("n查无此数!n"); //若找不到,输出无此关键字
DeleteBBST(T,key); //删除该关键字所在的结点
BBSTPrintTree(T,0); //显示删除后的树
DestroyBBST(T); //程序结束前销毁BBST
getch(); //按任意键结束程序
}

时间: 2024-09-11 09:29:20

排序与查找及其应用:设计一个程序,用于查询一个IP所在的机构设计一个程序,用于查询一个IP所在的机构的相关文章

class-编写一个使用类模板对数组进行排序、查找和求元素和的程序。

问题描述 编写一个使用类模板对数组进行排序.查找和求元素和的程序. 设计一个类模板templateclass Array,用于对T类型的数组进行排序.查找和求元素和,然后由此产生模板类Array和Array. 解决方案 http://www.warting.com/program/201109/33601.html 第四题 解决方案二: 编写一个使用类模板对数组进行排序,查找和求元素和的程序.

PHP常用的排序和查找算法_php技巧

本文汇总了常见的php排序算法和查找,在进行算法设计的时候有不错的借鉴价值.现分享给大家供参考之用.具体如下: <?php /** * PHP最常用的四个排序方法及二种查找方法 * 下面的排序方法全部都通过测试 * auther : soulence * date : 2015/06/20 */ //PHP冒泡排序法 function bubbleSort(&$arr){ //这是一个中间变量 $temp=0; //我们要把数组,从小到大排序 //外层循环 $flag=false;//这个优

数据结构 排序和查找

#include <stdio.h> #include <stdlib.h> #include <time.h> const int ITEMNUM = 100; #define ElemType int //冒泡排序 void Bubblesort(ElemType R[],int n,int &comp_num,int &move_num) {  int i,j,flag=1;     //当flag为0,则停止排序  ElemType temp;

《互联网产品设计》一第1章 什么是产品设计1.1 一个网站不是一个产品

第1章 什么是产品设计 互联网产品设计浏览器里的书签是什么?手机里的应用是什么?很多网站.移动应用.服务和工具都已在网络上找得到,但你还想要一个新产品--因为你有一个问题需要解决,有一个体验需要设计出来,当然也包括它的视觉展示.你确定跟你一样,还有一群人的需求未得到满足,并且你也知道他们需要什么来满足这些需求. 如何创造一个应用程序让人们发现它?如何提供可以让人们反复使用的服务?如何创造一种工作方式,能够使你.你的合作伙伴以及你的产品跟上用户.市场甚至是整个世界的变化? 这本书将指导你去探索互联

Java程序员应当知道的10个面向对象设计原则

(设计原则)底线是永远追求高内聚.低耦合的编码或设计. Apache 和 Sun的开源代码是学习Java和OOPS设计原则的良好范例.它们向我们展示了,设计原则在Java编程中是如何使用的.Java JDK 使用了一些设计原则:BorderFactory类中的工厂模式.Runtime类中的单例模式.java.io 类中的装饰器模式.顺便说一句,如果您真的对Java编码原则感兴趣,请阅读Joshua Bloch 的Effective Java,他编写过Java API.我个人最喜欢的关于面向对象设

程序员应知道这十大面向对象设计原则

面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) . Decorator(装饰器).Observer(观察者) 等设计模式, 而没有把足够多的注意力放在学习面向对象的分析和设计上面.学习面向对象编程像"抽象"."封装"."多态"."继承" 等基础知识是重要的,但同时为了创建简洁.模块化的设计,了解这些设计原则也同等重要.我经常看到不同经验水平的java程序员,他们有的不

android-Android程序在手机上运行崩溃但是在模拟器上能运行但是还有一个模拟器也是崩溃的

问题描述 Android程序在手机上运行崩溃但是在模拟器上能运行但是还有一个模拟器也是崩溃的 package darkhorse.english.app; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import android.app.Activity; import android.content.Context; import android.database.Curso

整合微信小程序的Web API接口层的架构设计

在我前面有很多篇随笔介绍了Web API 接口层的架构设计,以及对微信公众号.企业号.小程序等模块的分类划分.例如在<C#开发微信门户及应用(43)--微信各个项目模块的定义和相互关系>介绍了相关模块的划分,在<基于微信小程序的系统开发准备工作>介绍了Web API的架构设计思路.本篇随笔对之前介绍的架构内容进行统一的调整更新,以便更加方便实际项目的应用开发,以期达到统一.重用.清晰的目的. 1.公众号.企业号.小程序模块的划分 我们知道,目前微信企业应用,分为公众号.企业号(企业

做完一个小网站的一点经验总结(2): asp.net+access程序运行环境的配置

access|asp.net|程序 今天把做好的东西发给了client(是她叫我做东西,就此称呼吧).结果她用配置asp程序的方法把程序配置好,然后运行,结果肯定不行拉~(只看到静态的界面,与数据库打交道的动态部分都不能显示).        为了解决此问题,我专门找了台没装.net环境的机子测试,此机子仅装了windows2000,带iis.以下是我的总结:       第一步,我首先在此机子上装了Microsoft.Net.Framework1.1软件包.       第二步,再装上Micr