您的位置:首页 > 其它

树的孩子兄弟表示法-因特网域名的查找

2017-12-13 20:58 330 查看
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<queue>
#include<stack>
#include<windows.h>
using namespace std;
typedef struct Elem
{
char name[50];
char id[50];
}Elem;
typedef struct Node
{
Elem data;
struct Node *firstchild,*nextsibling,*pretsibling;
}*Tree_Node;
queue<Tree_Node> Q;
stack<Tree_Node> S;
class tree
{
private:
Tree_Node T;
public:
tree()
{
T=NULL;
}
Tree_Node get()
{
return T;
}
void create()
{
FILE *fp;
if((fp=fopen("data.txt","r+"))==NULL)
{
printf("can not find!\n");
exit(0);
}
T=new Node;
Elem fa,ch;
int i=0;
Tree_Node r=NULL;
while(1)
{
fscanf(fp,"%s%s%s",fa.name,ch.name,ch.id);
if(ch.name[0]=='#')
break;
Tree_Node p=new Node;
strcpy(p->data.name,ch.name);
strcpy(p->data.id,ch.id);
p->firstchild=p->nextsibling=p->pretsibling=NULL;
Q.push(p);
if(fa.name[0]=='#')
T=p;
else
{
Tree_Node s=Q.front();
while(strcmp(s->data.name,fa.name)!=0)
{
Q.pop();
s=Q.front();
}
if(!s->firstchild)
{
s->firstchild=p;
r=p;
}
else
{
p->pretsibling=r;
r->nextsibling=p;
r=p;
}
}
}
fclose(fp);
}
void Search(char internet_name[])
{
Tree_Node p=T->firstchild;
char internet_point[10][15];
int l=strlen(internet_name);
int i=0;
int j=0;
int k=0;
while(i<l)
{
if(internet_name[i]!='.')
internet_point[j][k++]=internet_name[i];
else
{
internet_point[j][k]='\0';                   //字符串结束标志
j++;
k=0;
}
i++;
}
internet_point[j][k]='\0';
i=j;
while(i>=0)
{
while(p && strcmp(p->data.name,internet_point[i])!=0)
p=p->nextsibling;
if(p && (strcmp(p->data.name,internet_point[i])==0))
{
if(!i){
cout<<p->data.id<<endl;
return ;
}
else{
p=p->firstchild;
i--;
}
}
else{
cout<<"找不到域名或输入错误"<<endl;
return ;
}
}
}
void visit(Tree_Node t)
{
if(t)
printf("%s%s\n",t->data.name,t->data.id);
/*if(t->pretsibling)
printf(":%s\n",t->pretsibling->data.name);*/
}
void t_PreTravelTree(Tree_Node t)
{
if(t)
{
//cout<<t->data.name<<endl;
visit(t);
t_PreTravelTree(t->firstchild);
t_PreTravelTree(t->nextsibling);
}
}
void PreTravelTree()
{
t_PreTravelTree(T);
}
void Destory(Tree_Node &t)
{
if(t->firstchild)
Destory(t->firstchild);
if(t->nextsibling)
Destory(t->nextsibling);
free(t);
t=NULL;
}
~tree()
{
Destory(T);
}
};
int main()
{
char m[50];
strcpy(m,"www.ccnu.edu.cn");
tree t;
t.create();
t.Search(m);
//t.PreTravelTree();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: