Программирование >>  Элементы языков с и с++ 

1 ... 46 47 48 [ 49 ] 50 51 52 ... 200


/♦Функция выделяет пс1мять под структуру tnod и возвращает указатель на

эту Пс1МЯТЬ*/

tnod *р=р=(tnod *)malloc(S i zeof(tnod)); return(p);

tnod *MakeTree(tnod *p,char *w)

/*Эта функция формирует двоичное дерево.

р-указатель на структуру, по которой будет создаваться новый узел или будут проверяться старые узлы.

w-слово, поступающее для его поиска в дереве.

Если такое слово уже есть, то в счетчик структуры, где оно обнаружено, добавляется единица: подсчитывается, сколько одинаковых слов.

Если такого слова в дереве нет, то для него образуется новый узел (новая структура)

int cond;

if(p==NULL) /*появилось новое слово. Для этого слова еще нет узла и его надо создать*/

p=NodAlloc(); выделяется Пс1мять под новый узел

p->word=strsave(w);

/*введенное слово по strsaveO записывается в память и на него выдается указатель */

p->count =1; слово пока единственное

p->left=p->right= NULL;

/*т. к. это слово пока последнее в дереве, то этот узел не указывает на следующие (меньшие - слева или большие - справа) слова дерева*/

else if((cond=strcmp(w,p->word))==0)

/* слово не новое, тогда оно сравнивается со словом в узле, на который указывает указатель р*/

p->count++;

/*в этом узле - такое же слово, поэтому добавляем к счетчику единицу*/ else if(cond < 0)



-----------------------------

int TreePrint (tnod *р)

/Эта функция печатает или выводит на экран все дерево, рекурсивно себя вызьшая*/

if(p != NULL) I

TreePrint(p->left); выводит левый узел:

printf( p->count=%d p->word=%s\n ,p->count,p->word);

TreePrint(p->right); выводит правый узел

return (0); }

-------------------------------------------------------------

Ipragma argsused

int tmain(int argc, char* argv[]) I

tnod *pp,-

char s [maxline];

pp=NULL;

/ слово меньше того, которое в узле, поэтому его помещаем в левую часть к дерева опять же с помощью этой функции. Ее первая часть создаст узел в I динамической памяти, поместит в него слово, в левые и правые подузлы по-liieCTOT нули, т. к. пока дальше этого слова ни справа, ни слева ничего

нет, а в левую часть узла-предка поместит указатель на эту структуру */

p->left=MakeTree(p->left,w);

else if(cond > 0)

p->right=MakeTree(p->right,w);

/слово больше того, которое в узле, поэтому мы его помещаем в правую часть дерева опять же с помощью этой же функции: ее первая часть создаст узел в динамической памяти, поместит в него слово, в левые и правые подузлы поместит нули, т. к. пока дальше этого слова ни справа, ни слева ничего нет, а в правую часть уэла-предка поместит указатель на эту структуру */

return (р) ;

/возвращает указатель на область, где создана новая структура, или на структуру, в которую добавлена единица, т. к. поступившее слово совпало со словом в этой структуре*/



Глава}

int i=0;

printf( Enter your words: >\n ); while(getline(s,maxline)-1)

/*getline() возвращает количество введенных символов

Когда нажимаем только <Enter>, вводится всего один символ (\п).

Если от единицы отнять единицу, получим нуль, а это - для оператора while] сигнал о прекращении цикла*/

рр=МакеТгее(рр,S); формирует очередной узел

рр всегда указывает на начало дерева

} while TreePrint(рр); вывод дерева getch();

C:\WIND0WS\sy8tem32\cmd.exe


Рис. 7.10. Результат работы программы листинга 7.10

Физическая структура дерева приведена в табл. 7.1, а логическая - рис. 7.11.

Таблица 7.1. Физическая структура дерева! построенного программой листинга 710

wi:слово

в динамической

памяти

СТРУКТУРА

Указатель на слово wl

Количество слов wi: 1

Указатель на структуру, где находится w2

Указатель на структуру, где находится w3



1 ... 46 47 48 [ 49 ] 50 51 52 ... 200

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика