树的孩子兄弟表示法-因特网域名的查找
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; }
相关文章推荐
- 左孩子右兄弟表示多叉树查找返回下一个节点
- 二叉树--兄弟孩子表示法
- 树的孩子兄弟表示法 及遍历实现
- 第六章(5).树的孩子兄弟表示法
- 普通二叉树转二叉链表(孩子兄弟表示法)
- 构建树(孩子兄弟表示法)
- 数据结构之通用树(孩子兄弟表示法)
- 普通二叉树转二叉链表(孩子兄弟表示法)
- 树的孩子兄弟表示法
- 随意有根树的左孩子右兄弟表示法存储
- 求 以孩子-兄弟链表表示的树 的度、深度、叶结点和边
- 数据结构——树的孩子兄弟表示法
- VC++ 树的孩子兄弟表示法
- 数据结构:树--孩子兄弟表示法
- poj 1192 最优连通子集 树的孩子兄弟表示法+简单树型dp
- 树-孩子兄弟表示法的实现
- 孩子兄弟表示法(二叉链表树)
- 6-7-树的二叉链表(孩子-兄弟)存储表示-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版
- 任意有根树的左孩子右兄弟表示法存储
- 一般的树的创建,兄弟孩子表示法