堆二进制树打印方法

时间:2010-11-04 00:41:08

标签: c++ printing heap

在我的作业中,我知道我需要使用我的堆删除功能,它返回要打印的变量。但是,作业的要求非常模糊,如果有人能给我一个更好的解释,我很好奇。我很困惑如何使用第二或第三个参数,我知道需要一些排序,我需要两个for循环,但之后我迷路了。这是作业所说的:

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

此函数从堆结构中检索项目并在stdout上打印出来。要从堆结构中检索单个项,它将调用remove函数。此函数的第一个参数是堆结构的向量,第二个参数是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 :(得分:0)

从我可以收集到的内容看起来第二个参数是列表中的一个元素在打印出来时可以占用的空格数。第3个参数是允许在一行上打印的元素数。在print_list函数中,您需要跟踪已打印的元素数量,以确定是否需要根据此参数转到下一行。使用这两者,您应该能够很好地对齐输出。您需要了解如何进行输出格式化。

EG。 list = [1,9,14,2000,244,777,3,98102,88,53,14],size = 6,line = 3 输出:

     1     9    14
  2000   244   777
     3 98102    88
    53    14

你的最后一个参数是一个谓词,你似乎并没有在你的任何函数中使用它(当你根本没有使用参数时,这是一个错误的标志)。谓词函数参数应该用于执行传入的类型T所特有的内容。例如,在print_list中,它应该用于打印类型为T的变量。如果按照当前的方式打印元素,无法保证该类型能够正确打印。当然,它适用于像int和double这样的基本类型,但想象一下有几个不同成员的类型。想想你如何在其他函数中使用这个谓词 - 你能不能只用'&lt;'来比较对象或'&gt;'?