Метод печати двоичного дерева кучи - PullRequest
1 голос
/ 04 ноября 2010

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

template <class T, class P> void print_list (vector<T>&, 
    const int, const int, P); 

Эта функция извлекает элементы из структуры кучи и выводит их на стандартный вывод. Чтобы извлечь отдельный элемент из структуры кучи, он вызывает функцию удаления. Первый аргумент этой функции - вектор для структуры кучи, второй аргумент - это выделенный размер печатаемого элемента в stdout, третий аргумент - максимальное количество печатаемых элементов в одной строке, а последний аргумент - предикат .

Вот мой код:

#include "340.h"

#ifndef H_PROG7
#define H_PROG7

// data files

#define D1 "prog7.d1"
#define D2 "prog7.d2"
#define D3 "prog7.d3"

#define INT_SZ 4    // width of integer
#define FLT_SZ 7    // width of floating-pt number
#define STR_SZ 12   // width of string

#define INT_LN 15   // no of integers on single line
#define FLT_LN 9    // no of floating-pt nums on single line
#define STR_LN 5    // no of strings on single line

// function prototypes

template<class T,class P> void insert(vector<T>&, const T&, P);
template<class T,class P> T remove(vector<T>&, P);

template<class T,class P> void upheap(vector<T>&, int, P);
template<class T,class P> void downheap(vector<T>&, int, P);

template<class T,class P>
void get_list(vector<T>&, const char*, P);

template<class T,class P>
void print_list(vector<T>&, const int, const int, P);

template<class T, class P>
void get_list(vector<T>& v, const char* file, P func) {
ifstream inFile("file");
T data;

while(inFile >> data) {
  inFile >> data;
  insert(v, data, func);
}
}

template<class T, class P>
void insert(vector<T>& v, const T& data, P func) {
v.push_back( data );
upheap( v, v.size()-1, func );
}

template<class T,class P>
void upheap(vector<T>& v, int start, P func) {

while( start <= v.size()/2 )   {

  unsigned int parent = start / 2;

  if( parent - 1  <= v.size() && v[parent - 1] > v[parent] )
     parent = parent - 1;

  if( v[start] <= v[parent] )
     break;

  swap( v[start], v[parent] );
  start = parent;
}
}

template<class T,class P>
void downheap(vector<T>& v, int start, P func) {

while(start <= v.size()/2 )   {

  unsigned int child = 2 * start;

  if( child + 1 <= v.size() && v[child + 1] > v[child])
     child = child + 1;

  if( v[start] >= v[child] )
     break;

  swap( v[start], v[child] );
  start = child;
}
}

template<class T,class P>
T remove(vector<T>& v, P func) {
swap( v[0], v.back() );
T& item = v.back();

v.pop_back();
downheap( v, 1, func );

return item;
}

template<class T,class P>
void print_list(vector<T>& v, const int size, const int line, P func) {

for(int i = 1; i < v.size(); i++) {
  cout << remove(v, func) << " ";
}
}

#endif

1 Ответ

0 голосов
/ 04 ноября 2010

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

Например.list = [1, 9, 14, 2000, 244, 777, 3, 98102, 88, 53, 14], размер = 6, строка = 3 Вывод:

     1     9    14
  2000   244   777
     3 98102    88
    53    14

Ваш последний параметр является предикатомкоторый вы, кажется, фактически не используете ни в одной из своих функций (признак того, что вы делаете что-то не так, когда вообще не используете параметр).Параметр функции предиката должен использоваться для выполнения чего-то уникального для передаваемого типа T. Например, в print_list он должен использоваться для печати переменной типа T. Если вы печатаете элемент так, как вы это делаете в данный момент., нет гарантии, что тип будет напечатан правильно.Конечно, это будет работать для базовых типов, таких как int и double, но представьте тип с несколькими различными членами.Подумайте, как вам нужно использовать этот предикат и в других ваших функциях - можете ли вы просто сравнить объекты с «<» или «>»?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...