字典树(Trie树)模板

结构:

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;        
}

  

posted @ 2012-07-24 08:50  E_star  阅读(362)  评论(0编辑  收藏  举报