首页 > 代码库 > 检索树
检索树
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#define MAX_LETTERS 27#define MAX_CHAR 30//字符串的长度typedef enum {data,pointer}node_type;typedef struct trie_node *trie_pointer;struct trie_node{ int child; node_type tag; union{ char*key; trie_pointer letters[MAX_LETTERS]; }u;};int get_index(char*key,int i);void insert(trie_pointer t,char*key,int i);void insert_two(trie_pointer t,char*key,trie_pointer oldkey,int i);trie_pointer newnode();trie_pointer newnodekey(char*);/*指针结构体*/trie_pointer search(trie_pointer t,char* key,int i);trie_pointer del(trie_pointer r,char* key,int i);void look(trie_pointer r,char*key);void main(){ trie_node root; root.child=1; root.tag=pointer; for (int i = 0; i < MAX_LETTERS; ++i) root.u.letters[i]=NULL; insert(&root,"bluebird",0); insert(&root,"bunting",0); insert(&root,"bluejay",0); insert(&root,"bobwhite",0); insert(&root,"luebird",0); insert(&root,"ting",0); insert(&root,"lujay",0); insert(&root,"bobwte",0); insert(&root,"aluebird",0); insert(&root,"ung",0); insert(&root,"ejay",0); insert(&root,"white",0); insert(&root,"ebird",0); insert(&root,"tig",0); insert(&root,"bluejay",0); insert(&root,"bobwh",0); look(&root,"aaa"); look(&root,"bluebird"); look(&root,"bobwhite"); del(&root,"bobwhite",0); look(&root,"bobwhite"); look(&root,"bunting"); del(&root,"bunting",0); look(&root,"bunting"); del(&root,"aaaa",0);}void insert(trie_pointer t,char*key,int i){ int ki=get_index(key,i); trie_pointer n=t->u.letters[ki]; if (n == NULL) { trie_pointer n=newnodekey(key); t->u.letters[ki]=n;/*结构体加进去*/ ++t->child; } else{/*这个区有东西*/ if (n->tag == pointer)/*u中是指针*/ { insert(n,key,i+1); } else{/*u中是key*/ if(! strcmp(key,n->u.key)){ printf("已经存在%s\n",key ); return; } insert_two(t,key,t->u.letters[ki],i); } }}int get_index(char*key,int i){ if (key[i]==NULL) return 0; return tolower(key[i]) - 'a'+1;}void insert_two(trie_pointer t,char*key,trie_pointer oldkey,int i){ trie_pointer n; do{ n= newnode();/*未处理新申请的*/ t->u.letters[get_index(key,i)]=n;/* 放入原始区,所以不用i+1 */ t=n; ++i; }while(key[i] == oldkey->u.key[i]); t->u.letters[get_index(oldkey->u.key,i)]=oldkey;/*原来的值*/ n=newnodekey(key); t->u.letters[get_index(key,i)]=n;/*新的值*/ ++t->child;}trie_pointer newnode(){/*指针结构体*/ trie_pointer n; n= (trie_pointer)malloc(sizeof(struct trie_node));/*处理新申请的*/ for (int i = 0; i < MAX_LETTERS; ++i) n->u.letters[i]=NULL; n->tag=pointer; return n;}trie_pointer newnodekey(char* charkey){/*值结构体*/ char *c=(char*)malloc(sizeof(char)* (strlen(charkey)+1) );/*注意释放*/ strcpy(c,charkey); trie_pointer n= (trie_pointer)malloc(sizeof(struct trie_node)); n->u.key=c; n->tag=data;/*新值的标配*/ n->child=1; return n;}trie_pointer search(trie_pointer t,char* key,int i){ if (!t)return NULL; if (t->tag==data) return (strcmp(t->u.key,key))?NULL:t; return search(t->u.letters[get_index(key,i)],key,i+1);}void look(trie_pointer r,char*key){ trie_pointer k; if (k=search(r,key,0)){ printf("存在%s\n",k->u.key); } else{ printf("不存在%s\n",key); }}trie_pointer del(trie_pointer r,char* key,int i){ trie_pointer t=r->u.letters[get_index(key,i)]; trie_pointer re=NULL; if(!t){ printf("不存在要删除的值"); return NULL; } if (t->tag==data) { if (!strcmp(t->u.key,key))/*定位ok,即可删除*/ { free(t->u.key); free(t); --r->child;/*减一*/ r->u.letters[get_index(key,i)]=NULL;/*置为NULL*/ if (r->child==1){/*只是剩下一个值了*/ for (int i = 0; i < MAX_LETTERS; ++i) if(r->u.letters[i]!=NULL) return r->u.letters[i]; } return NULL; } else{/*是值了,但是不相同*/ printf("不存在要删除的值"); return NULL; } }re=del(t,key,i+1); if( re!=NULL)/*返回非NULL。执行*/ { free(r->u.letters[get_index(key,i)]); if (r->child == 1) return re; else{ r->u.letters[get_index(key,i)]=re; return NULL; } }return NULL;}
检索树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。