字典树模板
结构:
struct node { int flag; node *next[27]; }*head; |
生成节点:
/*动态分配内存*/ node * newnode() { int i; node * p = new node; // c语言用(node * )malloc(sizeof(node), 这里是动态分配内存,时间上可能消耗的多一些 p->flag = 0; for (i = 0; i < 26; i++) p->next[i] = NULL; return p; } /*静态分配内存*/ node T[1000000]; int t = 0; node * newnode() { int i; node * p = &T[t++]; p->flag = 0; for (i = 0; i < 26; i++) p->next[i] = NULL; return p; } 注意: 1:在此之前head一定要先分配,否则无法执行,这里自己老是出错。 2:还有如果处理多组数据的话一定要注意清空T[]数组,否则影响后边的处理。 |
插入操作:
void insert( char *s) { int i,k; int len = strlen (s); node *p = head; for (i = 0; i < len; ++i) { k = s[i] - 'a' ; if (p->next[k] == NULL) p->next[k] = newnode(); p = p->next[k]; } p->flag = 1; } |
查找操作:
bool search( char *s) { int i,k; int len = strlen (s); node *p = head; for (i = 0; i < len; ++i) { k = s[i] - 'a' ; if (p->next[k]) p = p->next[k]; else return false ; } if (p->flag) return true ; else return false ; } |
程序完毕后释放内存函数:
void del(node * p) { int i; if (p) //p不为空 { for (i =0; i <26; i++) if (p->next[i]) del(p->next[i]); //递归删除每一个p->next[] } free (p); p = NULL; } |