-
Notifications
You must be signed in to change notification settings - Fork 0
/
searchEngine.c
150 lines (142 loc) · 4.13 KB
/
searchEngine.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct trie
{
struct trie *alpha[26];
int wordflag;
};
typedef struct trie trie;
trie *root;
trie *createnode()
{
trie *node = (trie*) malloc(sizeof(trie));
if (node) {
for (int i = 0; i < 26; i++)
node->alpha[i] = NULL;
node->wordflag = 0;
}
return node;
}
int search_insert_delete(trie **node, char *word, char mode)
{
if (!(*node))
{
if (mode == 'i')
{
*node = createnode();
root = *node;
}
else if (mode == 's' || mode == 'd')
{
printf("\nRoot node does not exist.");
return 1;
}
}
trie *current = *node;
while (*word)
{
int index = (*word | ('A' ^ 'a')) - 'a';
if (!current->alpha[index])
{
if (mode == 'i')
{
current->alpha[index] = createnode();
}
else if (mode == 's' || mode == 'd')
{
printf("\nNo node found for character '%c'.", *word);
return 1; // Word not found
}
}
current = current->alpha[index];
word++;
}
if (mode == 's')
{
if (current && current->wordflag)
return 0; // Word found
else
return 1; // Word not found
}
if (!current->wordflag)
{
if (mode == 'i')
{
current->wordflag = 1;
return 0; // Insertion successful
}
else if (mode == 'd')
{
printf("\nWord not found for deletion.");
return 1; // Word not found for deletion
}
}
else if (mode == 'd')
{
current->wordflag = 0;
return 0; // Deletion successful
}
else
return 1; // Word already exists
}
int main()
{
int ch;
char data[][100] = {"tree", "queue", "stack", "dll", "graph","heap","array","trie","hash table","bst"};
int num_words = sizeof(data) / sizeof(data[0]); // Calculate the number of words in the list
for (int i = 0; i < num_words; i++) {
search_insert_delete(&root, data[i], 'i'); // Insert each word into the trie
}
do
{
char word[100]; // Increased word size limit
int result;
printf("\n\n1. Enter the word to be inserted \n2. Search from data \n3. Delete from data \n4. Exit \n\nEnter your choice: ");
scanf("%d", &ch);
switch (ch)
{
case 1:
printf("Hello you want to insert to the data: ??");
printf("\nEnter the word to be inserted: ");
scanf("%s", word);
result = search_insert_delete(&root, word, 'i');
if (result == 0)
{
printf("\nInsertion successful!");
}
else if (result == 1)
{
printf("\nInsertion failed! The word already exists in the trie.");
}
break;
case 2:
printf("\nEnter the word to be searched: ");
scanf("%s", word);
result = search_insert_delete(&root, word, 's');
if (result == 0)
printf("\nSearch successful!\nThe word is present in the trie.");
else
printf("\nSearch unsuccessful!\nThe word is not present in the trie!");
break;
case 3:
printf("\nEnter the word to be deleted: ");
scanf("%s", word);
result = search_insert_delete(&root, word, 'd');
if (result == 0)
printf("\nDeletion successful!");
else
printf("\nSearch unsuccessful!\nThe word is not present in the trie!");
break;
case 4:
break;
default:
printf("\nInvalid choice. Please enter a valid option.");
break;
}
}
while (ch != 4);
// Free allocated memory
// Not necessary in this example since program exits immediately after, but good practice
return 0;
}