/*
    第2種情報処理技術者試験    平成11年度・秋期・午後 問7
                                BohYoh Shibata PREPARATION
*/

#include      <stdio.h>

void      BinTreeSort( int  Root ) ;
void      DisplayData( int  Root ) ;

#define MAXNUM    5

typedef struct {
    char      Name[64] ;  /*  名前      */
    int       Age ;       /*  年齢      */
    float     Height ;    /*  身長      */
    float     Weight ;    /*  体重      */
    } STUDENT ;

STUDENT Stu[MAXNUM] = {
    { "相川 太郎", 19, 162.5, 65.4 },
    { "伊藤 四郎", 14, 158.0, 48.4 },
    { "加藤 五郎", 18, 182.0, 82.5 },
    { "田中 三郎", 12, 148.0, 46.8 },
    { "山中 次郎", 16, 178.5, 70.0 } } ;
int Upper[MAXNUM], Lower [MAXNUM] ;

main( )
{
     int Index ;
     for( Index = 0 ; Index < MAXNUM ;  Index++ ) {
          Upper[Index] = Index + 1 ;
          Lower[Index] = -1 ;
     }
     Upper[MAXNUM - 1] = -1 ;
     BinTreeSort( 0 );
     DisplayData( 0 );
}

void  BinTreeSort( int  Root )
{
     int Data, Next ;

     Data = Upper[Root] ;
     if ( Data == -1 )  return ;
     Upper[Root] = -1 ;
     while( Data != -1 ) {
         Next = Upper[Data] ;
         if ( Stu[Data].Height >=  Stu[Root].Height ) {
                Upper[Data] = Upper[Root] ;
                Upper[Root] = Data ;
         }
         else    {
                Upper[Data] = Lower[Root] ;
                Lower[Root] = Data ;
         }
         Data = Next;
      }
      Data = Upper[Root] ;
      if ( Data != -1 )  BinTreeSort( Data );
      Data = Lower[Root] ;
      if ( Data != -1 )  BinTreeSort( Data );
}

void  DisplayData( int  Root )
{
     if ( Root == -1 ) return ;
     DisplayData( Lower[Root] );
     printf(" 名前:%s  年齢:%d  身長:%f 体重:%f\n" ,
        Stu[Root].Name, Stu[Root].Age,
        Stu[Root].Height, Stu[Root].Weight ) ;
     DisplayData( Upper[Root] );
}