#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++编译通过的更多相关文章

  1. 用C语言写一个“事件”的模拟程序

    源:用C语言写一个“事件”的模拟程序 Example.c //定义一个函数指针 func int (*func) (void); //调用该函数相当于触发了事件. //该事件触发后,会检查函数指针fu ...

  2. 网络编程—【自己动手】用C语言写一个基于服务器和客户端(TCP)!

    如果想要自己写一个服务器和客户端,我们需要掌握一定的网络编程技术,个人认为,网络编程中最关键的就是这个东西--socket(套接字). socket(套接字):简单来讲,socket就是用于描述IP地 ...

  3. 【阿菜做实践】利用go语言写一个简单的Pow样例

    本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简单demo.开发IDE用的是JB Golang. 整个项目的文件结构如下: PoWdem ...

  4. Linux内核学习--写一个c程序,并在内核中编译,运行

    20140506 今天开始学习伟大的开源代表作:Linux内核.之前的工作流于几个简单命令的应用,因着对Android操作系统的情愫,“忍不住”跟随陈利君老师的步伐,开启OS内核之旅.学习路径之一是直 ...

  5. 用html语言写一个功课表

    今天在网上看了一个关于html的教程,主要是讲表格,看完之后认为有必要上机试试.于是就写了以下的一段代码. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb ...

  6. java语言写一个建议的五子棋

    经过16天的java学习,也学得了不少关于Java方面的知识,我想分享一下我用java写的一个简单的五子棋. 游戏规则: (1)对局双方各执一色棋子.(2)空棋盘开局.(3)白先.黑后,交替下子,每次 ...

  7. 用c语言写一个函数把十进制转换成十六进制(转)

    #include "stdio.h" int main() { int num=0;int a[100]; int i=0; int m=0;int yushu; char hex ...

  8. 用java语言写一个简易版本的登录页面,包含用户注册、用户登录、用户注销、修改密码等功能

    package com.Summer_0421.cn; import java.util.Arrays; import java.util.Scanner; /** * @author Summer ...

  9. 用python语言写一个简单的计算器

    假如我们有这样一个式子: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2 ...

随机推荐

  1. PHP源码编译安装

    cd php-5.6.0yum -y install libcurl-devel bzip2-devel zlib-devel libjpeg-devel libpng-devel freetype- ...

  2. vue中的路由嵌套

    1定义组件 const Index = { template:` <div>首页</div> ` } const Order = { template:` <div> ...

  3. oracle学习笔记一:用户管理(1)简单的命令

    1,打开操作界面 我们在安装好oracle后可以在两个地方打开要操作的界面.请看图一: 或者在运行窗口输入sqlplus.其实这里也是调用了bin下面的sqlplus.exe. 在打开dos命令行窗口 ...

  4. 阿里云oss怎么上传文件夹

    最近公司在做工程项目,实现文件夹云存储上传 网上找了很久,发现很多项目都存在一些问题,但还是让我找到了一个成熟的项目. 工程: 对项目的文件夹云存储上传功能做出分析,找出文件夹上传的原理,对文件夹的云 ...

  5. 深入浅出javascript(二)函数和this对象

    一.函数对象的属性和方法 函数是一种数据类型,也是对象,这一点很明确.因此,函数对象也可以添加属性和方法,但是这里的属性和方法是静态的,之所以这样说,就是为了区别构造函数. 示例如下: ①创建一个空的 ...

  6. 1033 To Fill or Not to Fill

    PAT A 1033 To Fill or Not to Fill With highways available, driving a car from Hangzhou to any other ...

  7. centos设置服务开机自动启动的方法

    centos安装好apache,mysql等服务器程序后,并没有设置成开机自动启动的,为避免重启后还要手动开启web等服务器,还是做下设置好,其实设置很简单,用chkconfig命令就行了. 例如要开 ...

  8. String、Stringbuffer、Stringbuilder三者之间的区别

    1.首先说运行速度,速度由快到慢排列:StringBuilder > StringBuffer > String String最慢的原因: String为字符串常量,而StringBuil ...

  9. mac版win10装eclipse图标太小了,解决办法(2k显示屏+win10)

    安装了Eclipse并且打开之后,发现图标显示极其细小,肉眼几乎无法看清了.这是由于Eclipse对高分屏没有作适配导致的. Windows 10本身对于高分屏的支持已是相当不错,苏菲4的屏幕分辨率为 ...

  10. 一天学习两个设计模式之Facade模式(外观模式,结构型模式)

    程序这东西随着时间推移,程序会越来越大,程序中的类越来越多,而且他们之间相互关联,这会导致程序结构变得越来越复杂.因此我们在使用他们时候,必须要弄清楚他们之间的关系才能使用他们. 特别是在调用大型程序 ...