In: Computer Science
Implement a dictionary application using C++ with the following features:
Load a dictionary file.
Given a prefix string that the user specifies, print the first word or all words in the dictionary with that string as their prefix.
Given two strings A and B that the user specifies, replace all occurrences of A in the dictionary file with B.
Spawning a new editor (e.g., vim) to allow the user to modify the dictionary file. Save the dictionary file afterwards.
All your source code must be put within one (1) file and your program should not have any extra library dependencies.
Please provide the coding in C and should compile with "$ gcc dict.c -g -O1 -o dict"
Good example of the file running is "./dict -d dict.txt"
PROGRAM :
SHORT AND EASY WAY TO IMPLEMENT DICT. USING C LANGUAGE :
Step 1:
Create a structure with two char arrays
Key
Value
This structure will act as a dictionary which can store key and
value pair.
To make it simple I have considered key and value to be text
data
Step 2:
Create a dynamic linked list with the structure created.
i.e. When ever a new key and value is added, add a node with the
structure.
When ever the key and value is removed, delete the node.
Step 3:
Create functions for reading, searching based on key and
value.
And even sorting the dictionary if required
ALGO USED :
Create a dict
Lets add foo, and bar to the dict
and print their values
Lets delete them
see, their gone, there NULL
add them again to proof it works
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/ Comment this line out to compile without a main function (used
when including into another application). /
#define TEST TRUE
typedef struct dict_t_struct {
char *key;
void *value;
struct dict_t_struct *next;
} dict_t;
dict_t **dictAlloc(void) {
return malloc(sizeof(dict_t));
}
void dictDealloc(dict_t **dict) {
free(dict);
}
void getItem(dict_t dict, char *key) {
dict_t *ptr;
for (ptr = dict; ptr != NULL; ptr = ptr->next) {
if (strcmp(ptr->key, key) == 0) {
return ptr->value;
}
}
return NULL;
}
void delItem(dict_t *dict, char key) {
dict_t ptr, prev;
for (ptr = *dict, prev = NULL; ptr != NULL; prev = ptr, ptr =
ptr->next) {
if (strcmp(ptr->key, key) == 0) {
if (ptr->next != NULL) {
if (prev == NULL) {
*dict = ptr->next;
} else {
prev->next = ptr->next;
}
} else if (prev != NULL) {
prev->next = NULL;
} else {
*dict = NULL;
}
free(ptr->key);
free(ptr);
return;
}
}
}
void addItem(dict_t *dict, char key, void *value) {
delItem(dict, key);
dict_t *d = malloc(sizeof(struct dict_t_struct));
d->key = malloc(strlen(key)+1);
strcpy(d->key, key);
d->value = value;
d->next = *dict;
*dict = d;
}
#ifdef TEST
int main(int argc, char **argv) {
dict_t **dict = dictAlloc();
addItem(dict, "foo", "bar");
addItem(dict, "bar", "foo");
printf("%s %s\n", (char )getItem(*dict, "foo"), (char )getItem(*dict, "bar"));
delItem(dict, "foo");
delItem(dict, "bar");
printf("%s %s\n", (char )getItem(*dict, "foo"), (char )getItem(*dict, "bar"));
addItem(dict, "foo", "bar");
addItem(dict, "bar", "foo");
addItem(dict, "bar", "pan");
printf("%s %s\n", (char )getItem(*dict, "foo"), (char )getItem(*dict, "bar"));
delItem(dict, "foo");
delItem(dict, "bar");
dictDealloc(dict);
return 0;
}
#endif