#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 26
typedef struct node //trie数结构体的定义以及变量的初始化(分配内存)
{
int num; // 该节点前缀 出现的次数
struct node *next[MAX]; //next数组用来存放下一节点的地址
} node;
node memory[1000000],*root; //先分配好内存。 malloc 较为费时
int k = 0,len;
void insertTrie(char *s) //插入节点
{
root=&memory[k++];//给根节点非配内存,根节点只用来存放下一个节点的地址,
//其他节点除了需要存放下一个节点的地址外还需要存放结构体成员内部的num值,即某个字符串作为前缀所出现的次数
for(i=0;i<26;++i)
root->next[i]=NULL; //空指针可以存放任何数的地址
node * p = root,*q;
int i,j,id;
len=strlen(s);
for(i=0;i<len;++i)
{
id=s[i]-'a';
if(p->next[id]==NULL) //下一节点不存在
{
q=&memory[k++];//释放一个新的节点并将其初始化
q->num=0;//新节点的num值为0,不存放任何字母
for(j=0;j<26;++j)
q->next[j]=NULL;
p->next[id]=q; //将下一个字符的地址赋值给根节点,即将两个节点有向的连接起来
}
p=p->next[id];//将节点与节点连接起来
p->num++;
}
}
int searchTrie(char *s) //搜索节点
{
int i,id;
node *p=root;
len=strlen(s);
for(i=0;i<len;++i)
{
id=s[i]-'a';
if(p->next[id]==NULL) //如果字符不存在
return 0;
p=p->next[id]; //
}
return p->num;
}
trie树静态分配内存模板
最新推荐文章于 2024-03-10 19:37:56 发布