#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. related work

    Traditional approaches, e.g., genetic algorithm (GA) [2] and ant colony optimization (ACO) [3], can ...

  2. linux命令详解之useradd命令使用方法[linux下 添加用户、删除用户、修改用户密码、用户组管理]

    http://www.jb51.net/article/45848.htm Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这 ...

  3. Apache hadoop安装配置

    1.网络中继更改问题 命令:   vi /etc/sysconfig/network-scripts/ifcfg-eth0 需要修改的代码 DEVICE=eth0 HWADDR=00:0C:29:11 ...

  4. TCP报文首部详解

    首部固定部分各字段的意义如下: 1.源端口和目的端口,各占2个字节. 2.序号:占4个字节,序号范围为0到2的32次方-1,序号增加到2的32次方-1之后,下一个序号变为0,在一个TCP连接中传送的字 ...

  5. Ng第七课:正则化与过拟合问题 Regularization/The Problem of Overfitting

    7.1  过拟合的问题 7.2  代价函数 7.3  正则化线性回归 7.4  正则化的逻辑回归模型 7.1  过拟合的问题 如果我们有非常多的特征,我们通过学习得到的假设预测可能能够非常好地适应训练 ...

  6. c语言洗牌算法

    #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> voi ...

  7. Leetcode--1. Two Sum(easy)

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  8. Maven提高篇系列之五——处理依赖冲突

    个人分类: Maven 不知道你在使用Maven时是否遇到过诸如"NoSuchMethodError"或"ClassNotFoundException"之类的问 ...

  9. 《mysql必知必会》学习_第13章_20180803_欢

    第13章:分组过滤. P83 select count(*) as num_prods from products where vend_id=1003; #返回vend_id=1003的产品数目总值 ...

  10. Eclipse运行wordcount步骤

    Eclipse运行wordcount步骤 第一步:建立工程,导入代码. 第二步:建立文件写入数据(以空格分开),并上传到hdfs上. 1.创建文件并写入数据: 2.上传hdfs 在hadoop权限下就 ...