1) послідовність слів, впорядкування за довжинами слів (якщо довжини збігаються, то за абетковим порядком); 2) нижній (від листків) зліва направо; 3) 3.1) надрукувати список подій, які відносяться до заданого часового проміжку та вказати їхню кількість; 3.2) вилучити всі вузли, які є листками дерева; 4) симетричний справа наліво; 5) вилучення вузлів з довгими словами.
/
/*******************************************************************
* Ти мусиш десь на компі зробити файл під назвою vvid в блокноті *
* Вона має бути заповнена так: слово ентер слово ентер *
* Після останнього слова нічого не ставити! *
* *
* Наприклад вміст файл *
* *
* sagrg * dgfd
* dhfdg
* jhkfgbj
* lghlbjl
* kjhbf
* nbnb
* jfkhg
* hjxfg
* ghfgjf *
* dhyjg
* fkfjk
* kjlagfhg
* jkhbf
* uilgn *
* *
*******************************************************************/
//Підключаєм бібліотекі
//<stdlib.h> для виділення пам"яті
#include<stdio.h>
#include<stdlib.h>
#include<string.h>//Для пошуку покмбінації
//MAX-Довжина слова
#define MAX 10
//Структура дерева: слово і вказівники на менший і більший елемент
typedef struct DER
{
char k[MAX];
struct DER *bil,*men;
}
der;
//р-вказівник на корінь дерева
der* p;
int kil;//Для того щоб знати скільки слів вивели
//Функція формування дерева
void form(der* pn,der** pz)
{
int a,b,i;
a=b=i=0;//Онулюєм
if(*pz==NULL)//Якщо місце пусте вставляєм в нього новий елемент
{
*pz=pn;
return;
}
while(pn->k[a]!='\0')//Рахуєм довжину нового слова
a++;
while((*pz)->k[b]!='\0')//Рахуєм довжину поточного слова
b++;
if(a==b)//Якщо довжина однакова перевіряєм по алфавіту
{
a=b=0;
while(a==b)//Робим цикл доти доки коди символів небудуть різними
{
if(pn->k[i]=='\0'&&(*pz)->k[i]=='\0')//Якщо в обох словах є нуль символ значить вони одинакові
{
free(pn);//Видаляєм нове одинакове слово
return;
}
a+=pn->k[i];//Сюда сумуєм коди символів нового речення
b+=(*pz)->k[i++];//Сюда сумуєм коди символів поточного речення з дерева
}
}
if(a<b)
form(pn,&(*pz)->men);//Якщо нове слово по коду менше за поточне слово то йдем до меншого
else
form(pn,&(*pz)->bil);//наоборот
}
//Функція вводу з файла
void vvid()
{
FILE* f;
int i;
char c;
der* pn;
f=fopen("C:\\pop\\ vvid.txt","r");//тут запхаєш свій шлях через "\\" і в кінці vvid.txt"
while(!feof(f))
{
pn=(der*)calloc(1,sizeof(der));//Виділяєм память для нового елемента
pn->bil=pn->men=NULL;//Онулюєм
pn->k[0]=NULL; //
i=0; //
while(1)
{
fscanf(f,"%c",&c);//Зчитуєм з файла посимвольно
if(c!='\n'&&!feof(f))//Якщо с є ентор значчить кінець слова, якщо feof(f)-то кінец файла
pn->k[i++]=c;//Записуєм посимвольно в наше слово
else
break;
}
pn->k[i]='\0';//Присвоюєм в кінці нульсимволь для того щоб знати де кінець слова
form(pn,&p);//Добавляєм новий елемент в дерево
}
fclose(f);//Закриваєм відкритий файл
}
//Функція виводу дерева (нижній (від листків) зліва направо)
void vuvid(der* pn)
{
if(pn->men!=NULL)//Якщо ще є менший йдем до нього
vuvid(pn->men);
if(pn->bil!=NULL)//Якщо ще є більший йдем до нього
vuvid(pn->bil);
puts(pn->k);
}
//Функція виводу слів по проміжку
void promigok(int a,int b,der* pn)
{
int dov=0;//Змінна для довжини слова
while(pn->k[dov]!='\0')//Рахуєм довжину нового слова
dov++;
if(dov>=a&&dov<=b)//Якщо довжина підходить
{
puts(pn->k);//виводим слово
kil++;//Рахуєм кількість виведених слів
}
if(pn->men!=NULL)//Якщо є менший елемент йдем до нього
promigok(a,b,pn->men);
if(pn->bil!=NULL)//Якщо є менший елемент йдем до нього
promigok(a,b,pn->bil);
}
//Функція видалення листків
void lustki(der* pn)
{
if(pn->bil!=NULL)//Якщо є більший елемент
{
if(pn->bil->bil==NULL&&pn->bil->men==NULL)//Якщо він листок то наступні будуть нулями
{
free(pn->bil);//Видаляєм листок
pn->bil=NULL;//Онулюєм його місце
return;//Виходим з функції
}
else//Якщо не листок
lustki(pn->bil);//Йдем до більшого
}
if(pn->men!=NULL)//Якщо є менший елемент
{
if(pn->men->bil==NULL&&pn->men->men==NULL)//Якщо він листок то наступні будуть нулями
{
free(pn->men);//Видаляєм листок
pn->men=NULL;//Онулюєм його місце
return;//Виходим з функції
}
else//Якщо не листок
lustki(pn->men);//Йдем до меншого
}
}
//Функція видалення дерева і піддерев (симетричний справа наліво)
void zvil(der* pn)
{
der* pz;
if(pn->bil!=NULL)//Якщо є більший йдем до нього
zvil(pn->bil);
if(pn->men!=NULL)//Якщо є менший
{
pz=pn->men;//Зберігаєм вказівник меншого
free(pn);//Звільняєм поточний елемент
zvil(pz);//викликаєм функцію зі збереженим елементом
}
else
free(pn);//Якщо він останній то видаляєм
}
//Функція яка видаляє довгі слова (Будем вважати що довгі то слова які мають більше 6 букв)
void dovgislova()//Не рекурсивна
{
int dov,i;//Змінна для довжини слова
der* pn;//Вказівник на дерево для роботи
while(1)//Вічний цикл
{
i=0;//Лічильник для того щоб знати коли вийти з цикла
pn=p;//Берем вказівник на корінь
while(1)//Вічний цикл
{
if(pn->bil!=NULL)//Якщо є більший елемент
{
dov=0;//Довжину онюлюєм
while(pn->bil->k[dov]!='\0')//Рахуєм довжину наступного більшого слова
dov++;
if(dov>=7)//Якщо довжина більше 6
{
i++;//Збільшуєм лічильк
zvil(pn->bil);//Видаляєм більшу гілку
pn->bil=NULL;//Онулюєм її місце
break;//Зупиняєм цикл
}
else//Якщо менше 7
{
pn=pn->bil;//Йдем до більшого
continue;
}
}
if(pn->men!=NULL)//Якщо є менший елемент
{
dov=0;//Довжину онюлюєм
while(pn->men->k[dov]!='\0')//Рахуєм довжину наступного більшого слова
dov++;
if(dov>=7)//Якщо довжина більше 6
{
i++;//Збільшуєм лічильк
zvil(pn->men);//Видаляєм меншу гілку
pn->men=NULL;//Онулюєм її місце
break;//Зупиняєм цикл
}
else//Якщо менше 7
{
pn=pn->men;//Йдем до меншого
continue;
}
}
break;//Зупиняєм цикл
}
if(i==0)//Якщо дорівнює 0 значіть нічого не видалялось
return;//Виходим з функції
}
}
//Головна функція
void main()
{
int a,b;//Зміння для проміжку
vvid();//Зчитуєм слова з файлу
printf("Pochatkove derevo\n");
vuvid(p);//Виводи початкове дерево
printf("Vvedit promigok v kilkosti bykv\n");
scanf("%d%d",&a,&b);//Зчитуєм проміжок
promigok(a,b,p);//Виводим всі слова які підхоять під проміжок
if(kil!=NULL)//Якщо виводилось значить відмінне від 0
printf("\nKilkist vuvedenuh sliv=%d\n",kil);//Виводи кількість виведених слів
else
printf("\nTakuh sliv nemaye\n");//Якщо 0 то виводим що таких немає
lustki(p);//Видаляєм листкі з дерева
printf("\nDerevo pislya vudalennya lustkiv\n");
vuvid(p);//Виводим дерево після видалення листків
a=0;
while(p->k[a]!='\0')//Рахуєм довжину кореня
a++;
if(a<7)//Якщо воно не довге
{
dovgislova();//Шукаєм довгі слова і видаляєм
printf("\nDerevo pislya vudalennya dovguh sliv\n");
vuvid(p);//Виводим дерево після видалення довгих слів
}
zvil(p);//Видаляєм ціле дерево
fflush(stdin);
getchar();//Затримка
}