Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!1-25.doc
Скачиваний:
7
Добавлен:
28.10.2018
Размер:
2.62 Mб
Скачать

7.4 Параметризированный класс очередь

#include <iostream.h>

#include <stdlib.h>

// параметризированный класс очереди

template <class Qtype> class queue {

Qtype *q;

int sloc, rloc;

int length;

public:

queue (int size);

~queue() { delete [] q; }

void add ( Qtype x);

Qtype pop ();

};

// конструктор

template <class Qtype> queue<Qtype>::queue( int size )

{

size++;

q = new Qtype[size];

if (!q) {

cout << "Невозможно создать очередь.\n";

exit(1);

}

length = size;

sloc = rloc = 0;

}

// добавление элемента

template <class Qtype> void queue<Qtype>::add(Qtype i)

{

if ( sloc+1==length ) {

cout << "Очередь заполнена";

return;

}

sloc++;

q[sloc] = i;

}

// извлечение элемента

template <class Qtype> Qtype queue<Qtype>::pop()

{

if ( rloc == sloc ){

cout << "Очередь пуста.\n";

return 0;

}

rloc++;

return q[rloc];

}

int main ()

{

queue<int> a(5), b(5);

a.add(100);

b.add(200);

a.add(300);

b.add(400);

cout << "Очередь int 1: ";

cout << a.pop() << " ";

cout << a.pop() << " \n";

cout << "Очередь int 2: ";

cout << b.pop() << " ";

cout << b.pop() << " ";

queue<double> c(5), d(5);

c.add(8.12);

d.add(9.23);

c.add(-2.2);

d.add(0.986);

cout << "Очередь double 1: ";

cout << c.pop() << " ";

cout << c.pop() << " \n";

cout << "Очередь double 2: ";

cout << d.pop() << " ";

cout << d.pop() << " ";

return 0;

}

7.5

класс В 131.107.0.0

Расчет ведется на 15 подсетей по 1000 узлов каждый

15п/с10=11112 - 4 бита

24-2=14<15 Нужно использовать 5 бит

25-2=30, 30-15=15-запас дополнительных сетей

111110002=24810

Маска подсети 255.255.248.0

3+8=11 ”0”

211-2=2046 узла

2046-1000=1046-запас узлов

8.1 Понятие дерева. Классификация деревьев. Способы представления дерева.

Древовидная структура характеризуется множеством узлов (nodes), происходящих от единственного начального узла, называемого корнем (root). На Рис. 3 корнем является узел А. В терминах генеалогического дерева узел можно считать родителем (parent), указывающим на 0, 1 или более узлов, называемых сыновьями (children). Например, узел В является родителем сыновей E и F. Родитель узла H - узел D. Дерево может представлять несколько поколений семьи. Сыновья узла и сыновья их сыновей называются потомками (descendants), а родители и прародители – предками (ancestors) этого узла. Корень дерева — это единственный узел, нe имеющий непосредственного предка. Например, узлы E, F, I, J – потомки узла B. Каждый некорневой узел имеет только одного родителя, и каждый родитель имеет 0 или более сыновей. Узел, не имеющий детей (E, G, H, I, J), называется листом (leaf). При представлении в памяти компьютера элементы дерева (узлы) связывают между собой таким образом, чтобы каждый узел был связан со своим непо­средственным предком и/или своими непосредственными потомками. Наибо­лее распространенными способами представления дерева являются следую­щие три (или их комбинации).

При первом способе каждый узел (кроме корня) содержит указатель на узел, являющийся его непосредственным предком, т. е. на элемент, находящийся на более высоком уровне иерархии. Для корня дерева соответствующий ука­затель будет пустым. При таком способе представления, имея информацию о местоположении некоторого узла, можно, отслеживая указатели, поднимать­ся на более высокие уровни иерархии. К сожалению, этот способ представле­ния непригоден, если требуется не только подниматься вверх по дереву, но и спускаться вниз, и при этом нет возможности получать независимо ссылки на узлы дерева. Тем не менее такое представление дерева иногда используется в алгоритмах, где прохождение узлов всегда осуществляется в восходящем по­рядке. Преимуществом этого способа представления дерева является то, что в нем используется минимальное количество памяти, причем практически вся она эффективно используется для представления связей.

Второй способ представления применяют, если каждый узел дерева имеет не более двух (в общем случае не более К) непосредственных потомка. Тогда можно включить в представление узла указатели на этих потомков. В этом случае дерево называют двоичным (бинарным), а два поддерева каждого узла называют соответственно левым и правым поддеревьями этого узла. Разуме­ется, узел может иметь и только одно — левое или правое — поддерево (эти две ситуации в бинарных деревьях обычно считаются различными) или мо­жет вообще не иметь поддеревьев (и в этом случае узел называется концевым или терминальным узлом или листом дерева). При этом способе представле­ния достаточно иметь ссылку на корень дерева, чтобы получить доступ к лю­бому узлу дерева, спускаясь по указателям, однако, память при таком способе представления используется не столь эффективно— часть зарезервирован­ной памяти будет содержать пустые указатели.

template <class T>

class Tree {

// Определение класса для узла дерева

struct Node { Т item; // содержимое узла Node *left; // указатель на левое поддерево

Node *right; // указатель на правое поддерево // Конструктор узлов дерева:

Node(const T & item, Node *left = NULL, Node *right = NULL) { Node::item = item;

Node::left = left; Node::right = right; } };

Третий способ представления дерева состоит в том, что каждый узел списка содержит список своих поддеревьев. При этом можно задать такой список, непосредственно используя шаблон классов List, так что описание структуры узла дерева в контексте описания шаблона для самого дерева могло бы вы­глядеть следующим образом:

struct Node { Т item; // содержание узла List<Tree<T>*> subtrees; // список поддеревьев };

Самые простые из деревьев считаются бинарные деревья.

Бинарное дерево-это конечное множество элементов, которое либо пусто, либо содержит один элемент, называемый корнем дерева, а остальные элементы множества делятся на два непересекающихся подмножества, каждое из которых само является бинарным деревом.

Эти подмножества называются левым и правым поддеревьями исходного дерева.

Сильноветвящиеся деревья могут содержать в своих узлах более, чем один ключ.

Разрешим тройные и четверные узлы, которые могут содержать два или три ключа соответственно. У тройного узла есть 3 выходящие из него ветви, одна ветвь для всех записей ключи которых меньше чем оба его ключа, одна для всех записей, которые больше либо равны первому ключу, но меньше второго , и одна для всех записей, которые больше его ключей или равны второму ключу. Аналогично, 4-ной узел имеет 4 ветви выходящие из него; по одной для каждого интервала определенного его 3 ключами. (Узлы в обычном бинарном дереве можно таким образом называть двойными узлами: один ключ, две ветви.)

Сильноветвящееся дерево можно представить с использованием связных списков для запоминания указателей сыновей каждой вершины.