2010-11-04 6 views
1

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

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 
+0

Извините, я не понимаю. Требуется больше деталей. Кстати, 'stdout' для C - в C++, вы используете' cout'. –

+0

@steve Townsend просто добавил, что мой код надеется, что это прояснит ситуацию. – rajh2504

ответ

0

Из того, что я могу собрать это выглядит как 2-го параметра является количество пробелов один элемент в списке разрешенных занять, когда он распечатан. Третий параметр - это количество элементов, которые могут быть напечатаны на одной строке. В вашей функции print_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 

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

Смежные вопросы