#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. Codeforces 1060E(思维+贡献法)

    https://codeforces.com/contest/1060/problem/E 题意 给一颗树,在原始的图中假如两个点连向同一个点,这两个点之间就可以连一条边,定义两点之间的长度为两点之间 ...

  2. java web 怎么下载大文件(上百M)

    Java代码   ; ]; , )) != -) { , bytesRead); 13.               } 14.               toClient.write(buffer ...

  3. android-基础编程-ListView

    ListView主要包括view和数据源.其数据适配器列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter. ListView的没有oom原因.经 ...

  4. SSM_CRUD新手练习(4)修改生成的mapper.xml映射文件

    我们为什么要修改呢,这是因为我们查询的时候,我们有时候需要连表查询,例如我们需要查询出员工表的信息(emp_id,emp_name...)与此同时,我们还想查询出该员工所在的部门(dept_name) ...

  5. java锁类型

    转载链接在每个锁类型后边 线程锁类型 1.自旋锁 ,自旋,jvm默认是10次吧,有jvm自己控制.for去争取锁 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchroni ...

  6. (原创)c++中的类型擦除

    c++11 boost技术交流群:296561497,欢迎大家来交流技术. 关于类型擦除,可能很多人都不清楚,不知道类型擦除是干啥的,为什么需要类型擦除.有必要做个说明,类型擦除就是将原有类型消除或者 ...

  7. node-webkit学习(1)hello world

    )hello world 文/玄魂 目录 node-webkit学习(1)hello world 前言 1.1  环境安装 1.1.1 windows下的安装 1.1.2  linux环境下的安装 1 ...

  8. Redis 5.0 安装

    下载安装RedisServer mkdir –p /data/download && cd /data/download wget http://download.redis.io/r ...

  9. Windows核心编程:第5章 作业

    Github https://github.com/gongluck/Windows-Core-Program.git //第5章 作业.cpp: 定义应用程序的入口点. // #include &q ...

  10. 免 Google Play 的安卓应用下载平台

    本文已过时,以后会在我的新博客内更新 https://blog.clso.fun/posts/2019-03-22/non-google-play-apk-download.html 鉴于那啥你懂的原 ...