Автор работы: Пользователь скрыл имя, 20 Декабря 2010 в 09:12, курсовая работа
Данная программа представляет собой реализацию нелинейной структуры данных в памяти и предлагает интерфейс для работы с ней. Чтобы реализовать структуру данных в памяти используется динамический массив указателей на строки, в который при вводе сохраняются указатели на вводимые строки, затем они сортируются по возрастанию длины. Полученный массив указателей сортируется таким образом, чтобы линейно с помощью операции вставки в дерево сформировать сбалансированное дерево. Структура данных представляет собой:
1.Задание………………………………………….……………...…………………3
2.Структурное описание разработки……………………………...……………...4
3.Функциональное описание………………………………………..……………..8
4.Описание работы программы на контрольном примере и выводы……….…9
5.Литература…………………………..………………………………………..…12
{
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->
if(right)
this->
}
// функция подсчета длинн ветвей
void len()
{
head->define_len(
}
//
функция рекурсивного
void define_len(int _len)
{
len = _len;//в лен хранится предыдущее значение
if(left)
left->
if(right)
right-
}
// функция рекурсивного подсчета листьев в дереве
int get_top_count(int &_count)//каунт передаем по ссылки,если каунт изменим,то и изменится оно везде.
{
if(left)
left->
if(right)
right-
if(!left && !right)//проверяем что вправо и влево уже идти некуда
_
return _count;
}
//
функция суммирования длин
int get_sum_len(int &_len)//лен передаем по ссылки,если лен изменим,то и изменится везде оно.
{
if(left)
left->
if(right)
right-
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->
if(right)
this->
delete[] p;//удаляем теекущий элемент,возвращаемся в предыдущий элемент
}
// функция рекурсивной очистки дерева
void clear()
{
if(left)
{
}
if(right)
{
}
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(
{
}
else//
{