在提出以下问题之前,我确实尽了4个小时的努力寻找答案,但不幸的是,我没有在C++中找到我想要的东西。希望你们中的一些人能帮助我。问题很简单。我有一个链表,其节点采用2个键值,例如:
struct myNode{
int a ;
int b ;
myNode *nextNode ;
myNode *prevNode ;
} ;
我可以使用COUT垂直显示这样一个列表的所有节点,例如(伪代码):
while (myList){
cout << myList->a << " " << myList->b << "n" ;
increment myList (myList = myList->nextNode) ;
}
结果将是:
a1 b1
a2 b2
a3 b3
.
.
.
an bn
与其垂直显示,我想水平显示它们,结果类似于:
a1 a2 a3 a4 ... an
b1 b2 b3 b4 ... bn
换句话说,我如何在C++中垂直打印n个元素,然后向右移动,开始垂直打印其他n个元素(从第一行开始),与前一列平行,以此类推…
谢谢你的回答。
L。
在控制台中跳回一行需要特定于操作系统的方法,在这种情况下不建议使用。我能想到的最简单的方法是使用两个循环,比如:
while (myList)
{
cout << myList->a << " ";
increment myList (myList = myList->nextNode);
}
cout << "n";
// set myList to begin
while (myList)
{
cout << myList->b << " ";
increment myList (myList = myList->nextNode);
}
我没有发现问题。例如
int const n = blahblah;
for( auto p = myList; p != nullptr; p = p->nextNode )
{
cout << setw( n ) << p->a;
}
cout << endl;
for( auto p = myList; p != nullptr; p = p->nextNode )
{
cout << setw( n ) << p->b;
}
cout << endl;
更新。
在一条评论中,OP解释了他认为的上述问题:
“如果我们使用上面提出的解决方案,我们将需要为列表的每个键值编写一个For或While循环。
代码复制非常容易–琐碎地–通过命名和参数化序列输出操作(例如)进行补救
template< class Pointer, class MemberPointer >
void display_value_sequence( Pointer const my_list, MemberPointer const m )
{
int const n = blahblah;
for( auto p = my_list; p != nullptr; p = p->nextNode )
{
cout << setw( n ) << p->*m;
}
}
void foo()
{
// ...
using Node = decltype( *myList );
display_value_sequence( myList, &Node::a ); cout << endl;
display_value_sequence( myList, &Node::b ); cout << endl;
}
人们可能会对此进行抽象,例如,某个函数返回项的字符串表示的vector<string>
,等等,但我认为这还为时过早。
免责声明:代码未经编译器处理。