いつ停止するかを関数に伝える必要があります。出力できるノードの数 (最初は 5) のカウンターを提供でき、1 つのノードが実際に出力されるたびに、カウンターをデクリメントします。
(または、カウンターをインクリメントすることもできますが、その場合、チェックには現在のカウンター値と最大カウンター値の 2 つの項があり、両方をパラメーターとして渡すか、それらをグローバル変数にする必要があります)。
印刷に加えて何かをする必要がある場合、またはより柔軟な
int printInOrder(void* theTree, int remaining, void(*printnode)(void *data))
{
if (0 == remaining)
return 0;
struct AVLTreeNode *node= (struct AVLTreeNode*)theTree;
if (node == NULL) return remaining;
remaining = printInOrder(node->left, remaining, printnode);
// When actually printing nodes, decrement counter
(printnode)(node->data); remaining--;
return printInOrder(node->right, remaining, printnode);
}
printInOrder(tree, 5, ...);
印刷に加えて何かをする必要がある場合、またはより柔軟な機能が必要な場合は、同じことを行うことができますが、パラメーターをに渡しますprintnode
。
void printInOrder(void* theTree, int remaining, int(*printnode)(int r, void *data))
{
struct AVLTreeNode *node= (struct AVLTreeNode*)theTree;
if (node == NULL) return remaining;
printInOrder(node->left, remaining, printnode);
remaining = (printnode)(remaining, node->data);
printInOrder(node->right, remaining, printnode);
}
この 2 番目のケースではprintnode
、カウンターを操作するprintInOrder
だけで、渡すだけです。現在、printnode
ノードごとに 1 回呼び出されますが、カウンターがゼロ以外の場合にのみ実際の印刷を行い、すべての場合に他のハウスキーピングを行うことができます。