В моем задании я знаю, что мне нужно использовать функцию удаления кучи, которая возвращает переменную, подлежащую печати. Но требование в задании довольно расплывчато, и мне было любопытно, может ли кто-нибудь дать мне лучшее объяснение. Я совершенно смущен тем, как использовать второй или третий аргументы. Я знаю, что требуется сортировка, и мне нужны два цикла, но после этого я потерялся. вот что назначение говорит:Метод печати двоичного дерева кучи
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
Извините, я не понимаю. Требуется больше деталей. Кстати, 'stdout' для C - в C++, вы используете' cout'. –
@steve Townsend просто добавил, что мой код надеется, что это прояснит ситуацию. – rajh2504