trie樹動態分配記憶體模板
阿新 • • 發佈:2019-01-04
#include <stdio.h> #include<stdlib.h> #include<string.h> #define MAX 26 typedef struct TrieNode //trie的資料結構定義 { int v; // 該節點作為前綴出現的次數 struct TrieNode *next[MAX]; //next為指向結構體自身的一個空指標陣列,用來存放下一節點的地址 //空指標陣列可以存放任何數的地址。 } Trie; Trie *root; //構建字典樹 void createTrie(char * str) { int len=strlen(str); root=(Trie *)malloc(sizeof(Trie)); for(int i=0;i<MAX;i++) root->next[i]=NULL; Trie *p=root,*q; for(int i=0;i<len;i++) { int id = str[i] - 'a'; //當前字元應該插入的位置 if (p->next[id]==NULL) //沒有節點,則開闢一個新的節點 { q=(Trie *)malloc(sizeof(Trie)); q->v =1; //則該節點作為字首的次數為1 for(int i = 0; i < MAX; i++) q->next[i] = NULL; //新建節點的地址為0 p->next[id]=q; p=q; } else { p=p->next[id]; p->v++; } } } //搜尋字典樹 int searchTrie(char * str) { Trie *p =root; int len=strlen(str); for(int i=0;i<len;i++) //如果這個字母存在 { int id = str[i] - 'a'; //確定這個字母的位置 if(p->next[id]==NULL) return 0; p->next[id]; } return p->v; //返回最後的那個字元 所在節點的n,即搜尋字串作為前綴出現的次數 }