KATHIR VEL99 Ответов: 1

Как сохранить базу данных слов в следующей программе? Я не знаю, как объединить файлы и указатели


Эта проблема присутствует во многих кодах (одной и той же словарной программы), с которыми я столкнулся в интернете. Даже те, которые используют двоичное дерево на других сайтах, не функционируют должным образом. Так что заинтересованные и вдумчивые люди, пожалуйста, помогите мне. Это будет большим подспорьем, если эта проблема будет решена
Так что, пожалуйста, помогите, так как я должен представить свой проект через несколько дней...

Что я уже пробовал:

#include < stdio.h>
#include <stdlib.h>
#include & lt;string.h>
#включить & lt;conio. h>
структура BSTnode {
слово char [128], означающее[256];
struct BSTnode *left, *right;
};

struct BSTnode *root = NULL;
struct BSTnode *createNode(char * word, char *meaning) {
struct BSTnode *newnode;
newnode = (структуры BSTnode *)Танос(оператор sizeof(структура BSTnode));
strcpy(newnode- & gt;word, word);
strcpy(newnode- & gt;значение, значение);
newnode - & gt;left = newnode-> right = NULL;
return newnode;
}
void insert (char *word, char *meaning) {
структура BSTnode *родитель = значение null, *ток = нуль, *newnode = нуль;
int res = 0;
если (! root) {
root = createNode(слово, значение);
вернуть;
}
for (current = root; current !=NULL; current = (res > 0)? current - & gt;right: current- & gt;left)
{
res = strcmp(word, current - > word);
если (res == 0)
{
printf ("дубликат записи!!\северный");
вернуть;
}
родитель = текущий;
}
newnode = createNode(слово, значение);
РЭС и gt; 0 ? (родитель-&ГТ;право = newnode) : (родитель-&ГТ;слева = newnode);
вернуть;
}

void deleteNode(char *str) {
структура BSTnode *родитель = значение null, *ток = нуль, *температура = значение null;
int flag = 0, res = 0;
если (! root) {
printf("BST нет!!\n");
вернуть;
}
ток = корень;
а (1)
{
res = strcmp(current - & gt;word, str);
если (res == 0)
перерыв;
флаг = res;
родитель = текущий;
ток = (res > 0)? current - & gt;left : current- & gt;right;
if (current = = NULL)
вернуть;
}
/ * удаление листового узла */
if (current - > right = = NULL) {
if (current = = root & & amp; current- & gt;left == NULL) {
свободный (текущий);
корень = нуль;
вернуть;
}
иначе если (current = = root)
{
root = current- & gt;left;
свободный (текущий);
вернуть;
}
флаг > 0? (parent - & gt;left = current- & gt;left) :
(родитель - & gt;right = текущий - & gt;left);
}
ещё
{
/ * удалить узел с одним дочерним узлом */
temp = current - & gt;справа;
если (! temp - & gt;left) {
темп-&ГТ;слева = ток&ГТ;слева;
if (current = = root) {
корень = темп;
свободный (текущий);
вернуть;
}
флаг > 0 ? (parent - & gt;left = temp) :
(родитель- & gt;right = temp);
}
ещё
{
/ * удалить узел с двумя дочерними узлами */
struct BSTnode *successor = NULL;
а (1)
{
преемник = temp - & gt;слева;
если (!преемник-&ГТ;слева)
перерыв;
temp = преемник;
}
темп-&ГТ;слева = правопреемника-&ГТ;право;
преемник - & gt;left = текущий - & gt;left;
преемник - & gt;right = текущий - & gt;right;

if (current = = root)
{
корень = преемник;
свободный (текущий);
вернуть;
}
(флаг > 0) ? (родитель - & gt;слева = преемник) :
(родитель- & gt;право = преемник);
}
}
свободный (текущий);
вернуть;
}

void findElement(char *str) {
struct BSTnode *temp = NULL;
int flag = 0, res = 0;
if (root = = NULL)
{
printf ("бинарное дерево поиска вышло из строя!!\северный");
вернуть;
}
temp = корень;
в то время как (temp) {
if ((res = strcmp(temp- & gt;word, str)) = = 0) {
printf ("Word: %s", str);
printf ("значение: %s", temp- & gt;значение);
флаг = 1;
перерыв;
}
темп = (РЭС и gt; 0) ? темп-&ГТ;слева : темп-&ГТ;право;
}
если (! флаг)
printf ("элемент поиска не найден в двоичном дереве поиска\n");
вернуть;

}

void inorderTraversal(struct BSTnode *myNode)
{
если (myNode)
{
inorderTraversal(myNode - & gt;слева);
printf ("Word: %s", myNode- & gt;word);
printf ("значение: %s", myNode- & gt;значение);
printf ("\n");
inorderTraversal(myNode - & gt;right);
}
вернуть;
}

тап_п()
{clrscr();
int ch;
char str[128], что означает[256];
а (1)
{
printf ("\n1. Вставка\t2. Удаление\n");
printf("3. Поиск\t4. Прохождение\Н");
printf("5. Exit\nEnter ur choice:");
scanf ("%d", & ch);
функция getchar();
переключатель (ch) {
корпус 1:
printf ("слово для вставки:");
fgets(str, 100, stdin);
printf ("значение:");
fgets(значение, 256, stdin);
вставить (str, значение);
перерыв;
случай 2:
printf ("введите слово для удаления:");
fgets(str, 100, stdin);
deleteNode(str);
перерыв;
случай 3:
printf ("введите поисковое слово:");
fgets(str, 100, stdin);
findElement (str);
перерыв;
случай 4:
inorderTraversal (корень);
перерыв;
корпус 5:
выход(0);
по умолчанию:
printf("вы ввели неверный параметр\n");
перерыв;
}
}
возвращает 0;

[no name]

Просто сбросить ваш неформатированный код в публикацию - это не вопрос и не проблема.

KATHIR VEL99

извините, уважаемый!! этот код функционирует должным образом. но у меня есть проблема, о которой я уже упоминал. поэтому, пожалуйста, сохраняйте свое достоинство так же, как и мое. если вы можете ответить хорошо и хорошо. в противном случае, пожалуйста, не унижайте чужие сомнения

[no name]

Извините, но вы не задали ни одного вопроса и не описали никакой проблемы. Если код работает правильно, то почему вы сбросили его сюда? Что такое " у " или "УР"? Какое отношение имеет буква алфавита и древний шумерский город Ур? Ваша неспособность задать вопрос или описать проблему не имеет ничего общего с достоинством.

1 Ответов

Рейтинг:
2

Jochen Arndt

Вы должны реализовать функцию итератора для двоичного дерева, которая перебирает все элементы и записывает их в файл.

Функция итератора уже существует (inorderTraversal). Так что используйте это как базу:

void saveToFile(const char *fileName)
{
    if (root)
    {
        FILE *f = fopen(fileName, "w");
        if (f)
        {
            saveNodeToFile(root, f);
            fclose(f);
        }
    }
    return;
}

void saveNodeToFile(const struct BSTnode *myNode, FILE *f)
{
    if (myNode)
    {
        saveNodeToFile(myNode->left, f);
        fprintf(f, "%s %s\n", myNode->word, myNode->meaning);
        saveNodeToFile(myNode->right, f);
    }
    return;
}