Древовидные структуры

Автор работы: Пользователь скрыл имя, 20 Декабря 2010 в 09:12, курсовая работа

Описание

Данная программа представляет собой реализацию нелинейной структуры данных в памяти и предлагает интерфейс для работы с ней. Чтобы реализовать структуру данных в памяти используется динамический массив указателей на строки, в который при вводе сохраняются указатели на вводимые строки, затем они сортируются по возрастанию длины. Полученный массив указателей сортируется таким образом, чтобы линейно с помощью операции вставки в дерево сформировать сбалансированное дерево. Структура данных представляет собой:

Содержание

1.Задание………………………………………….……………...…………………3
2.Структурное описание разработки……………………………...……………...4
3.Функциональное описание………………………………………..……………..8
4.Описание работы программы на контрольном примере и выводы……….…9
5.Литература…………………………..………………………………………..…12

Работа состоит из  1 файл

Копия записка.doc

— 169.50 Кб (Скачать документ)

{

public: 

      // структура вершины дерева

      struct elem

      { 

      char *p;  // указатель на строку

      elem *left,*right; // указатель на левого и правого потомков

      int count; // счетчик вершин в поддереве

      int len; // длина ветви 

      // конструктор вершины дерева без  параметров

      elem()

            {

                  p = NULL;//указатель на строку =0

                  left = right = NULL;//вправо/влево =0

                  count = 0;

                  len = -1;

            } 
 

      // конструктор вершины дерева с  параметрами

      elem(char *str)

            {

                  p = new char[strlen(str) + 1];//выделяем память под новую строку длиной лен+1

                  strncpy(p, str, strlen(str) + 1);//записываем эту строку в дерево

                  left = right = NULL;

                  count = 0;

                  len = -1;

            } 
 

      // деструктор вершины дерева

      ~elem()

            {

                  delete[] p;

            } 

      // функция рекурсивной распечатки  вершин дерева

      void print()

            {

      cout << " count= " << count << " len= " << len << " p= " << p << endl;//выводим всю инфу о данной вершине

                  if(left)

                        this->left->print();//идем влево пока не 0

                  if(right)

                        this->right->print();//идем вправо пока не 0

            } 

      // функция подсчета длинн ветвей

      void len()

      {

            head->define_len(0);

      } 

      // функция рекурсивного нахождения  длинн ветвей в каждой вершине

      void define_len(int _len)

            {

                  len = _len;//в лен хранится предыдущее значение

                  if(left)

                        left->define_len(len + 1);//идем влево по дереву и на каждой вершине увеличиваем лен на 1

                  if(right)

                        right->define_len(len + 1);//идем вправо по дереву и на каждой вершине увеличиваем лен на 1

            } 
 
 

      // функция рекурсивного подсчета  листьев в дереве

      int get_top_count(int &_count)//каунт передаем по ссылки,если каунт изменим,то и изменится оно везде.

            {

                  if(left)

                        left->get_top_count(_count);//идем влево пока есть куда идти

                  if(right)

                        right->get_top_count(_count);//идем вправо пока есть куда идти

                  if(!left && !right)//проверяем что вправо и влево уже идти некуда

                        _count++;//увеличиваем каунт на 1 если некуда идти

                  return _count;

            } 
 

      // функция суммирования длин всех  ветвей в дереве

      int get_sum_len(int &_len)//лен передаем по ссылки,если лен изменим,то и изменится везде оно.

            {

                  if(left)

                        left->get_sum_len(_len);//идем влево пока есть куда идти

                  if(right)

                        right->get_sum_len(_len);//идем вправо пока есть куда идти

                  if(!left && !right && len > -1)//если идти некуда и ЛЕН>-1

                        _len += len;//в лен у нас длина ветви для каждой вершины, потом мы прибавляем к _лен(которая хранит в себе значениесуммы длин ветвей) прибавляем лен

                  return _len;

            } 
 

      // функция подсчета средней длины  ветви в дереве

      void med_len()

            {

                  cout << head->med_len() << endl;

            } 

      // функция подсчета средней длины  ветви

      int med_len()

      {

            int len = 0;

            int a = get_sum_len(len);//записываем в а сумму всех длин ветвей

            len = 0;//обнуляем лен

            int b = get_top_count(len);//записываем в б количество листьев

            return a / b;//находим среднюю длину ветви

      } 

      // функция рекурсивной очистки  дерева

      void del()

            {

                  if(left)

                        this->left->del();//идем до конца влево пока больше некуда будет идти влево

                  if(right)

                        this->right->del();//идем вправо если влево некуда

                  delete[] p;//удаляем теекущий элемент,возвращаемся в предыдущий элемент

            } 

      // функция рекурсивной очистки  дерева

      void clear()

            {

                  if(left)

                        {

                              this->left->clear();//идем влево и вызываем рекурсию(эту же функцию),пока есть куда

                        }                     //идем враво и проверяем можно ли идти влево,как дойдем до листа

                  if(right)               //возвращаемся назад идем враво,дошли до листа,возвращаемся назад и удаляем лист справа и слева.

                        {

                              this->right->clear();

                        }

                  if(left)

                        delete left;

                  if(right)

                        delete right; 

            } 

      //

      int summ(int r)

            {

                  r += count;//прибавляем  к р количество веришин в текущем поддереве

                  if(left){

                        r += left->count;}//прибавляем количество вершин в поддереве слева к  р

                  if(right){

                        r += right->count;}//тоже самое только справа

                  return r;

            } 
 

      // функция вставки в дерево

      void push(char *str) 

            {

                  this->count++;

                        if(strlen(str) < strlen(this->p))//если длина строки добавляемой меньше длины строки то

                        {

                              if(this->left == NULL)//если слева ничего нету

                              {

                                    this->left = new elem;//то создаем элемент новый

                                    this->left->p = new char[strlen(str) + 1];//выднеляем память под строку

                                    strncpy(left->p, str, strlen(str) + 1);//переписываем эту строку

                              }

                              else

                                    this->left->push(str);//если у нас есть слева что-ннибудь,то мы вызываем функцию вставки для следующего элемента слева

                        }

                        else//если длина строки добавляемой строки больше длины строки то все тоже что и справа

                        {

Информация о работе Древовидные структуры