#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#include <locale>
#include <io.h>
struct TreeNode
{
TreeNode *leaf1, *leaf2;
int n;
int inf;
};
//создание и добавление информации в дереве
void add(TreeNode **treeNode, int info)
{
TreeNode *current, *tree;
//если дерево не существует
if (!*treeNode)
{
if (!(current = (TreeNode *)calloc(1, sizeof(TreeNode))))
return;
*treeNode = current;
current->inf = info;
current->n = 1;
return;
}
//в корень
tree = *treeNode;
//поиск необходимого узла
do
{
//если инфо =
if (info == tree->inf)
{
tree->n++;
return;
}
else
{
//есди инфо < и если >
if (info < tree->inf)
if (tree->leaf1)
tree = tree->leaf1;
else break;
else
if (tree->leaf2)
tree = tree->leaf2;
else break;
}
} while(1);
//добавляем узел
if (!(current = (TreeNode *)calloc(1, sizeof(TreeNode))))
return;
if (info < tree->inf)
tree->leaf1 = current;
else
tree->leaf2 = current;
current->inf = info;
current->n=1;
}
void see(TreeNode *treeNode)
{
static int i; //счетчик уровней
i++; //увеличиваем на 1, т.к. следуюющий уровень
int i2 = i; //текуший уровень
if(treeNode)
{
if (treeNode->leaf2)
{
see(treeNode->leaf2);
i = i2;
}
//отступ
for(int j = 0; j < i; j++)
{
printf("%2s", "");
}
//вывод
printf("%2c\n", treeNode->inf);
if (treeNode->leaf1)
{
see(treeNode->leaf1);
i = i2;
}
}
i = 0;
}
void FileToTree(FILE *file, TreeNode **tree)
{
char chr;
while (!feof(file))
{
chr = fgetc(file);
if (feof(file))
{
break;
}
if (chr != '\n' && chr != ' ' && chr != '\0')
{
add(tree, chr);
}
}
}
void PrintFile(FILE *file)
{
char buffer[255];
printf(" текст файла:\n");
while (!feof(file))
{
fgets(buffer, 255, file);
if (feof(file))
{
break;
}
printf("%s", buffer);
}
}
void AnalisFile(FILE *file, char *word)
{
fpos_t begin, end, len, current;
char buffer[255];
char chr;
while (!feof(file))
{
fgetpos(file, &begin);
//читаем слово
fscanf(file, "%s", buffer);
fgetpos(file, &end);
//если конец файла
if (feof(file))
{
break;
}
//сравниваем слова
if (strcmp(buffer, word) == 0)
{
len = end - begin;
current = end;
do
{
fseek(file, current, SEEK_SET);
chr = fgetc(file);
if (feof(file))
{
break;
}
fseek(file, current - len, SEEK_SET);
fputc(chr, file);
current = current + 1;
}while (!feof(file));
chsize(fileno(file), filelength(fileno(file)) - len);
fseek(file, begin, SEEK_SET);
}
}
}
void main()
{
system("cls"); setlocale(LC_ALL, "rus");
FILE *file;
TreeNode *treeRoot = NULL;
const char fname[] = "file.txt";
char buffer[255];
char word[50];
printf("Желаете перезаписать файл? (y - да) ");
char chr = getch();
if (chr == 'y' || chr == 'н')
{
//записываем исходный файл
file = fopen(fname, "wt");
do
{
system("cls");
printf("Введите текст:\n"); fflush(stdin);
gets(buffer);
fprintf(file, "%s\n", buffer);
printf("Желаете продолжить? (n - выход) ");
} while (getch() != 'n');
fclose(file);
}
// system("cls");
//вводим слово для удаления
printf("\nВведите слово для удаления: "); fflush(stdin); scanf("%s", word);
//анализируем файл и переписываем, удаляя данное слово
file = fopen(fname, "r+t");
AnalisFile(file, word);
fclose(file);
//вывод исзодного
file = fopen(fname, "rt");
printf("\n\nИсходный");
PrintFile(file);
fclose(file);
file = fopen(fname, "rt");
printf("\n\n");
FileToTree(file, &treeRoot);
fclose(file);
see(treeRoot);
getch();
}