没啥事用C语言写一个Trie tree玩玩,支持中英文,用g++编译通过
#include <cstdio>
#include <cstdlib>
#include <vector> #define ALPHABETS 2600000
#define CASE 0
#define MAX_WORD_SIZE 25 using namespace std; struct node
{
struct node *parent;
struct node *children[ALPHABETS];
vector<int> occurrences;
}; int IsGB(char *pText)
{
unsigned char sqChar[];
sqChar[] = *pText;
if (sqChar[] >= 0xa1)
if (sqChar[] == 0xa3)
return ; //全角字符
else
return ; //汉字
else
return ; //英文、数字、英文标点
} void insertWord(struct node *trieTree, char *word, int index)
{
struct node *traverse = trieTree; while (*word != '\0')
{
if (IsGB(word)!=)
{
if (traverse->children[-abs(*word)] == NULL)
{
traverse->children[-abs(*word)] = (struct node *)calloc(, sizeof(struct node));
traverse->children[-abs(*word)]->parent = traverse; // Assigning parent
}
traverse = traverse->children[-abs(*word)];
++word;
++word;
}
else
{
if (traverse->children[*word - CASE] == NULL)
{
traverse->children[*word - CASE] = (struct node *)calloc(, sizeof(struct node));
traverse->children[*word - CASE]->parent = traverse; // Assigning parent
}
traverse = traverse->children[*word - CASE];
++word;
}
} traverse->occurrences.push_back(index);
} struct node *searchWord(struct node *treeNode, char *word)
{
while (*word != '\0')
{
if (IsGB(word)!=)
{
if (treeNode->children[-abs(*word)] != NULL)
{
treeNode = treeNode->children[-abs(*word)];
++word;
++word;
}
else
{
break;
}
}
else
{
if (treeNode->children[*word - CASE] != NULL)
{
treeNode = treeNode->children[*word - CASE];
++word;
}
else
{
break;
}
}
} if (*word == '\0' && treeNode->occurrences.size() != )
{
printf("Word found");
return treeNode;
}
else
{
// Word not found
printf("Word not found");
return NULL;
}
} void removeWord(struct node *trieTree, char *word)
{
struct node *trieNode = searchWord(trieTree, word); if (trieNode == NULL)
{
return;
} trieNode->occurrences.pop_back();
bool noChild = true; int childCount = ;
int i; for (i = ; i < ALPHABETS; ++i)
{
if (trieNode->children[i] != NULL)
{
noChild = false;
++childCount;
}
} if (!noChild)
{
return;
} struct node *parentNode; while (trieNode->occurrences.size() == && trieNode->parent != NULL && childCount == )
{
childCount = ;
parentNode = trieNode->parent; for (i = ; i < ALPHABETS; ++i)
{
if (parentNode->children[i] != NULL)
{
if (trieNode == parentNode->children[i])
{
parentNode->children[i] = NULL;
free(trieNode);
trieNode = parentNode;
}
else
{
++childCount;
}
}
}
}
} void lexicographicalPrint(struct node *trieTree, vector<char> word)
{
int i;
bool noChild = true; if (trieTree->occurrences.size() != )
{
vector<char>::iterator charItr = word.begin(); while (charItr != word.end())
{
printf("%c", *charItr);
++charItr;
}
printf(" -> @ index -> "); vector<int>::iterator counter = trieTree->occurrences.begin(); while (counter != trieTree->occurrences.end())
{
printf("%d, ", *counter);
++counter;
} printf("\n");
} for (i = ; i < ALPHABETS; ++i)
{
if (trieTree->children[i] != NULL)
{
noChild = false;
word.push_back(CASE + i); lexicographicalPrint(trieTree->children[i], word);
word.pop_back();
}
} } int main()
{
int n, i;
vector<char> printUtil; struct node *trieTree = (struct node *)calloc(, sizeof(struct node));
char word[MAX_WORD_SIZE]; printf("Enter the number of words-\n");
scanf("%d", &n); for (i = ; i <= n; ++i)
{
scanf("%s", word);
insertWord(trieTree, word, i);
} lexicographicalPrint(trieTree, printUtil); // scanf("%s", word);
// removeWord(trieTree, word); // printf("\n"); //
// lexicographicalPrint(trieTree, printUtil); printf("\nEnter the Word to be search - ");
scanf("%s", word);
searchWord(trieTree, word); return ;
}
编译:g++ tr.cpp -o tr.exe
没啥事用C语言写一个Trie tree玩玩,支持中英文,用g++编译通过的更多相关文章
- 用C语言写一个“事件”的模拟程序
源:用C语言写一个“事件”的模拟程序 Example.c //定义一个函数指针 func int (*func) (void); //调用该函数相当于触发了事件. //该事件触发后,会检查函数指针fu ...
- 网络编程—【自己动手】用C语言写一个基于服务器和客户端(TCP)!
如果想要自己写一个服务器和客户端,我们需要掌握一定的网络编程技术,个人认为,网络编程中最关键的就是这个东西--socket(套接字). socket(套接字):简单来讲,socket就是用于描述IP地 ...
- 【阿菜做实践】利用go语言写一个简单的Pow样例
本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简单demo.开发IDE用的是JB Golang. 整个项目的文件结构如下: PoWdem ...
- Linux内核学习--写一个c程序,并在内核中编译,运行
20140506 今天开始学习伟大的开源代表作:Linux内核.之前的工作流于几个简单命令的应用,因着对Android操作系统的情愫,“忍不住”跟随陈利君老师的步伐,开启OS内核之旅.学习路径之一是直 ...
- 用html语言写一个功课表
今天在网上看了一个关于html的教程,主要是讲表格,看完之后认为有必要上机试试.于是就写了以下的一段代码. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb ...
- java语言写一个建议的五子棋
经过16天的java学习,也学得了不少关于Java方面的知识,我想分享一下我用java写的一个简单的五子棋. 游戏规则: (1)对局双方各执一色棋子.(2)空棋盘开局.(3)白先.黑后,交替下子,每次 ...
- 用c语言写一个函数把十进制转换成十六进制(转)
#include "stdio.h" int main() { int num=0;int a[100]; int i=0; int m=0;int yushu; char hex ...
- 用java语言写一个简易版本的登录页面,包含用户注册、用户登录、用户注销、修改密码等功能
package com.Summer_0421.cn; import java.util.Arrays; import java.util.Scanner; /** * @author Summer ...
- 用python语言写一个简单的计算器
假如我们有这样一个式子: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2 ...
随机推荐
- jquery删除onclick属性和设置onclick属性--获取验证码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- c#中委托与事件
参考:http://www.tracefact.net/tech/009.html 张子阳:http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/9 ...
- 动态样式CSS
<link>标签可以把外部css样式引入HTML页面 <style>元素用于指定嵌入的样式 通过修改link的href属性,改变引入的css样式 function loadSt ...
- Check the NativeLink log file
今天用Quartus ii16.1仿真Cyclone IV的IP核DDR2,总是报上面的错误 .网上都说是modelsim路径的问题, 但我确定不是.最后用QaurtusII 12.1可以通道仿真. ...
- PreTranslateMessage(MSG* pMsg)专题
.. BOOL CQuickMosaicDlg::PreTranslateMessage(MSG* pMsg) { if (pMsg->message==WM_KEYDOWN) //键盘按下 { ...
- Android自定义视图三:给自定义视图添加“流畅”的动画
这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...
- hdu 4704 Sum 【费马小定理】
题目 题意:将N拆分成1-n个数,问有多少种组成方法. 例如:N=4,将N拆分成1个数,结果就是4:将N拆分成2个数,结果就是3(即:1+3,2+2,3+1)--1+3和3+1这个算两个,则这个就是组 ...
- Scala_控制结构
控制结构 if条件表达式 val x = 6 if (x>0){ println("This is a positive number") }else if(x== ...
- NLTK之WordNet 接口【转】
转自:http://www.cnblogs.com/kaituorensheng/p/3149095.html WordNet是面向语义的英语词典,类似于传统字典.它是NLTK语料库的一部分,可以 ...
- 64位进程调用32位dll的解决方法
64位进程调用32位dll的解决方法 最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/ ...