格式化输出c ++的问题

时间:2009-12-08 04:18:19

标签: c++ c

我正在研究二叉搜索树。 我在输出节点左对齐时遇到问题。我打印数组顺序,预订,订单,后序...数组顺序格式左对齐,就像我希望它... 我基本上使用相同的代码(setw和左;以相同的顺序)作为数组顺序,因为我与preo顺序,其余.. 但是,它不会左对齐..

我已经尝试过一切...... 任何技巧?

正确输出..

Database Of Great Computer Scientists

>>> array order:

name                       leaf?  index
----                       -----  -----
Ralston, Anthony                      0
Liang, Li                             1
Von Neumann, John                     2
Jones, Doug                           3
Trigoboff, Michael                    5
Goble, Colin               leaf       7
Knuth, Donald                         8
Turing, Alan               leaf      12
Kay, Alan                  leaf      17
(items printed)                          (9)

>>> preorder:


name                       leaf?  index
----                       -----  -----
Ralston, Anthony                      0
Liang, Li                             1
Jones, Doug                           3
Goble, Colin               leaf       7
Knuth, Donald                         8
Kay, Alan                  leaf       17
Von Neumann, John                     2
Trigoboff, Michael                    5
Turing, Alan               leaf       12
(items printed)                          (9)

>>> inorder:


name                       leaf?  index
----                       -----  -----
Goble, Colin               leaf       7
Jones, Doug                           3
Kay, Alan                  leaf       17
Knuth, Donald                         8
Liang, Li                             1
Ralston, Anthony                      0
Trigoboff, Michael                    5
Turing, Alan               leaf       12
Von Neumann, John                     2
(items printed)                          (9)

>>> postorder:


name                       leaf?  index
----                       -----  -----
Goble, Colin               leaf       7
Kay, Alan                  leaf       17
Knuth, Donald                         8
Jones, Doug                           3
Liang, Li                             1
Turing, Alan               leaf       12
Trigoboff, Michael                    5
Von Neumann, John                     2
Ralston, Anthony                      0
(items printed)                          (9)

>>> retrieve Trigoboff, Michael

Trigoboff, Michael

>>> retrieve Kaye, Danny

not found

这里是有序的代码。其余的功能在设置输出的方式上几乎相同..

void BST::displayInOrder(ostream& out, int parent)const
{
if (parent <= maxsize) 
{

this->displayInOrder(out, 2 * parent + 1);  

if (!items[parent].empty)
{
out << left
<< setw(27) << items[parent].instanceData;
out << right
<< setw(10);
if(!items[parent].isLeaf)
{
out << left
 << setw(11) << "leaf";

}
out << setw(12) << parent;
out << endl;
}  

this->displayInOrder(out, 2 * parent + 2 ); 

}

if(!parent)
{
itemsPrinted(out,size);
}

}

,这是左对齐的数组顺序代码..

void BST::displayArrayOrder (ostream& out) const
{

out << ">>> array order:" << endl;
displayHeaders(out);


for(int index=0; index < maxsize+1; index++)
{

 if (!items[index].empty) 
 {
 out << left
 << setw(27) << items[index].instanceData;
 out << right
 << setw(10);

 if(index > size)
 {
 items[index].isLeaf = false;
 out << left

 << setw(10) << "leaf";
 }
 if(items[2*index+1].empty && items[2*index+2].empty && index < size)
 {
  items[index].isLeaf = false;
  out << left

 << setw(11) << "leaf";
 }

out << setw(12) << index;
 out << endl;


 }


 }
 if(!parent)
 {
 itemsPrinted(out,size);
 }


   }

2 个答案:

答案 0 :(得分:3)

帮自己一个忙:编写一个函数来显示记录,并在需要的任何地方使用它来显示该类型的记录。由于您已经拥有在一个地方工作的代码,因此只需在print_record()(或您决定称之为的任何内容)的正文中使用该代码。

你应该尽快学到一件事:重复相同的基本代码三到四次是一个非常的事情,你应该避免它。

答案 1 :(得分:1)

在我看到您的代码时,displayArrayOrder不仅会显示顺序,还会设置isLeaf属性,然后该属性会直接用于其他显示功能。

正如Jerry Coffin指出的那样,将所有内容分开,并在所有显示功能中使用相同的打印记录功能。

这样的事情应该让你开始。 (显然,当leaf为假时,您打印isLeaf,我保留了该约定)

bool BST::hasToPrintLeaf(int index) {
  if (!items[index].isLeaf) {
    return true
  }
  if (index > size ||
      (index < size && items[2*index+1].empty && items[2*index+2].empty)) {
    items[index].isLeaf = false;
    return true;
  }
}

void BST::printRecord(std::ostream & out, int index) {
  out << left << setw(27) << items[index].instanceData;
  out << right << setw(10);

  if(hasToPrintLeaf(index)) {
    out << left << setw(11) << "leaf";
  }

  out << setw(12) << index << endl;
}

请注意,关于你的逻辑,我并没有真正改变任何东西,而我对某些事情有疑问......(你的两个叶子测试排除了索引==大小为例)