Разработка шаблона класса для работы с двоичными деревьями

Автор: Пользователь скрыл имя, 17 Октября 2012 в 05:26, курсовая работа

Описание работы

Целью данного курсового проекта является разработка шаблона класса для работы с двоичными деревьями.
Для разработки программы была выбрана среда Turbo C++ фирмы Borland.

Содержание

Введение 3
1.Выбор технологии, языка и среды программирования 4
2.Анализ и уточнение требований к программному продукту 5
Анализ процесса обработки информации и выбор структур данных для ее хранения 5
Выбор методов и разработка основных алгоритмов решения задачи 11
3.Проектирование интерфейса пользователя 12
Разработка форм ввода-вывода информации 12
1.Построение классов предметной области 13
Уточнение структуры классов предметной области и разработка алгоритмов методов 13
4.Выбор стратегии тестирования и разработка тестов 15
Заключение 16
Список использованных источников 17
Приложение А. Техническое задание 18
Приложение Б. Руководство пользователя 19
Приложение В. Код программы 20

Работа содержит 1 файл

ПЗ.doc

— 96.50 Кб (Скачать)

cout << A;

Для сложения и  вычитания массивов можно использовать следующую запись:

C=A+B

C=A-B

Для умножения  и деления массива на число можно использовать следующую запись:

B=A*5;

C=B/18;

 

 

Приложение В. Код программы

Файл BinTree.h

template <class T> class TreeNode

{

    public:

    TreeNode  *_lchild;

    TreeNode  *_rchild;

    int val;

    TreeNode(T);

    virtual ~TreeNode(void);

};

 

template<class T> TreeNode<T>::TreeNode(int v) :

  val(v), _lchild(NULL), _rchild (NULL)

{

}

 

template<class T> TreeNode<T>::~TreeNode(void)

{

  if (_lchild) delete _lchild;

  if (_rchild) delete _rchild;

}

 

template<class T> class BinTree

{

  private:

    TreeNode<T> *root;

    TreeNode<T> *_findMin(TreeNode<T> *);

    void _remove(T, TreeNode<T> * &);

    void _inorder(TreeNode<T> *, int);

  public:

    BinTree (void);

    ~BinTree (void);

    int isEmpty (void);

    T find(T);

    T findMin(void);

    void inorder (int);

    void insert(T);

    void remove(T);

    T removeMin (void);

};

 

template<class T> BinTree<T>::BinTree() :

  root (NULL)

{

}

 

template<class T> int BinTree<T>::isEmpty (void)

{

  return (root == NULL);

}

 

template<class T> BinTree<T>::~BinTree (void)

{

  if (root) delete root;

}

 

template<class T> T BinTree<T>::find (T val)

{

  TreeNode<T> *n = root;

  while (n)

  {

    int result = val - n->val;

    if (result < 0)

      n = n->_lchild;

else if (result > 0)

      n = n->_rchild;

else

      return n->val;

  }

  return  NULL;

}

 

template<class T> T BinTree<T>::findMin (void)

{

  TreeNode<T> *n = _findMin (root);

  return (n ? n->val : NULL);

}

 

template<class T>

TreeNode<T> *BinTree<T>::_findMin (TreeNode<T> *n)

{

  if (n  == NULL)

    return NULL;

  while   (n->_lchild)

    n = n->_lchild;

  return n;

}

 

template<class T> void BinTree<T>::inorder (int l)

{

  _inorder(root, l);

}

 

template<class T>

void BinTree<T>::_inorder (TreeNode<T> *n, int l)

{

  if (n == NULL) return;

  _inorder(n->_lchild, l);

  cout << n->val << endl;

  _inorder(n->_rchild, l + 1);

}

 

template<class T> void BinTree<T>::insert(T val)

{

  if (root == NULL) {

    root = new TreeNode<T>(val);

return;

  } else {

    int result;

    TreeNode<T> *p, *n = root;

    while (n) {

  p = n;

      result = val - n->val;

if (result < 0)

      n = p->_lchild;

else if (result > 0)

      n = p->_rchild;

else

      return;

}

    if (result < 0)

      p->_lchild = new TreeNode<T>(val);

else

      p->_rchild = new TreeNode<T>(val);

  }

}

 

template<class T> void BinTree<T>::remove(T val)

{

  _remove(val, root);

}

 

template<class T>

void BinTree<T>::_remove(T val, TreeNode<T> * &n)

{

  if (n == NULL) return;

  int result = val - n->val;

  if (result < 0)

    _remove(val, n->_lchild);

  else if (result > 0)

    _remove (val, n->_rchild);

  else

  {

    if (n->_lchild == NULL)

    {

      TreeNode<T> *old = n;

      n = old->_rchild;

      delete old;

    }

    else

    if (n->_rchild == NULL)

    {

      TreeNode<T> *old = n;

      n = old->_lchild;

      delete old;

    }

    else

    {

      TreeNode<T> *m = _findMin(n->_rchild);

      n->val = m->val;

      _remove(m->val, n->_rchild);

    }

  }

}

 

template<class T> T BinTree<T>::removeMin (void)

{

  T v = findMin();

  remove (v);

  return v;

}

Файл DemoArr.cpp

#include <iostream.h>

#include <conio.h>

#include "bintree.h"

 

BinTree<int> st;

int choice, El;

 

main()

{

  choice = 0;

  while (choice !=5)

  {

   clrscr();

   cout << "1. Добавить элемент" << endl;

   cout << "2. Удалить элемент" << endl;

   cout << "3. Найти элемент" << endl;

   cout << "4. Печать элементов" << endl;

   cout << "5. Выход" << endl;

   cin >> choice;

   switch (choice)

   {

     case 1:

     {

       cout << "Введите элемент: " << endl;

       cin >> El;

       st.insert(El);

       break;

     }

     case 2:

     {

       cout << "Введите элемент: " << endl;

       cin >> El;

       st.remove(El);

       break;

     }

     case 3:

     {

       cout << "Введите элемент: " << endl;

       cin >> El;

       if (El == st.find(El))

cout << "Элемент найден" << endl;

       else

 cout << "Элемент не найден" << endl;

       while (!kbhit()) {;}

       break;

     }

     case 4:

     {

       st.inorder(0);

       while (!kbhit()) {;}

       break;

     }

   }

  }

}

 


Информация о работе Разработка шаблона класса для работы с двоичными деревьями