#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct node {
struct Node* children[26];
int isEnd;
} Node;
Node* getNode(int a) {
Node* node = (Node*)malloc(sizeof(Node));
assert(node);
for (int i = 0; i < 26; i++) {
node->children[i] = NULL;
}
node->isEnd = a;
return node;
}
int is_exist(Node* root, char* s) {
for (int i = 0; s[i]; i++) {
if (!root->children[s[i] - 'a']) return 0;
root = root->children[s[i] - 'a'];
}
return root->isEnd;
}
void insert(Node* root, char* s) {
for (int i = 0; s[i]; i++) {
if (!root->children[s[i] - 'a']) {
root->children[s[i] - 'a'] = getNode(0);
}
root = root->children[s[i] - 'a'];
}
root->isEnd = 1;
return ;
}
void build_tree(Node* root, char s[][10], int n) {
for (int i = 0; i < n; i++) {
if (is_exist(root, s[i])) continue;
insert(root, s[i]);
}
return ;
}
void output(char* str, int k) {
for (int i = 0; i < k; i++) {
printf("%c", str[i]);
}
printf("\n");
return ;
}
void __fun(Node* root, char* str, int k) {
if (root->isEnd) output(str, k);
for (int i = 0; i < 26; i++) {
if (!root->children[i]) continue;
str[k] = i + 'a';
__fun(root->children[i], str, k + 1);
}
return ;
}
void fun(Node* root) {
char str[10];
printf("\n-------------");
__fun(root, str, 0);
printf("-------------");
return ;
}
int main() {
srand(time(0));
Node* root = getNode(1);
char s[10][10];
for (int i = 0; i < 10; i++) {
scanf_s("%s", s[i], 10);
}
build_tree(root, s, 10);
//遍历字典树
fun(root);
while (1) {
printf("\n你到底要想干啥???\n");
printf("0退出 1插入 2查询\n");
int a;
scanf_s("%d", &a);
if (a == 0) break;
char str[10];
if (a == 1) {
printf("输入你要插入的字符串,不能超过10嗷,超过自己扇自己一巴掌\n");
scanf_s("%s", str, 10);
insert(root, str);
fun(root);
}
else {
printf("输入你要查询的字符串\n");
scanf_s("%s", str, 10);
if (is_exist(root, str)) {
printf("你要的串已经准备好了");
}
else {
printf("煤油找到它~~");
}
}
}
return 0;
}
字典树【代码】
本文介绍了如何使用C语言实现了一个基于字符的字典树结构,包括节点定义、插入、查询以及遍历操作,用于字符串查找和插入应用。
摘要由CSDN通过智能技术生成