>>644
クィックソートあたりの実装を参考にするといいお。

こっちが再帰コール版
http://www.comp.dit.ie/rlawlor/Alg_DS/sorting/quickSort.c
再帰コールせず自前スタック管理とループで実現
http://www.d.umn.edu/~gshute/C/examples/quicksort.C.html

まぁ俺ならこんなコードにするかな。細かい部分は端折るが。

int depth = 0; //現在の階層; 0がトップ
LPNODE p = tree->head;
LPNODE *stack = (LPNODE*) malloc( sizeof (LPNODE) * 100 ) ;
for ( ;; ) {
  if ( p->child ) { //ネストあり
    開始タグ出力
    stack[depth++] = p; //push, 下の階層に逝く
    p = p->child;
  }

  出力とか

  if ( !p->next ) { //同階層の終端に達した
    p = stack[depth--]; //pop , 上の階層に戻る
    終了タグ出力
    if (depth == -1) break;
  }
  p = p->next; //同階層の次の要素を参照
}
free(stack);