/* ECP: FILEname=fig10_18.c */ /* 1*/ /* After Queue Is Doubled, Arrangement May Be Bad. */ /* 2*/ /* This Routine Fixes It, And Avoids Excessive Moves */ /* 3*/ static void /* 4*/ FixWraparound( Queue Q ) /* 5*/ { /* 6*/ const int OrigSz = Q->MaxSize / 2; /* 7*/ if( Q->Front < OrigSz / 2 ) /* 8*/ { /* 9*/ memcpy( &Q->Array[ OrigSz ], &Q->Array[ 0 ], /*10*/ Q->Front * sizeof( QuEtype ) ); /*11*/ Q->Back += OrigSz; /*12*/ } /*13*/ else /*14*/ { /*15*/ memcpy( &Q->Array[ OrigSz + Q->Front ], /*16*/ &Q->Array[ Q->Front ], /*17*/ ( OrigSz - Q->Front ) * sizeof( QuEtype ) ); /*18*/ Q->Front += OrigSz; /*19*/ } /*20*/ } /*21*/ /* 1*/ void /* 2*/ Enqueue( QuEtype X, Queue Q ) /* 3*/ { /* 4*/ QuInsistGood( Q ); /* 5*/ if( Q->Size == Q->MaxSize ) /* 6*/ { /* 7*/ Q->MaxSize *= 2; /* 8*/ Q->Array = realloc( Q->Array, /* 9*/ sizeof( QuEtype ) * Q->MaxSize ); /*10*/ if( Q->Array == NULL ) /*11*/ { /*12*/ printf( "Can not extend the queue\n" ); /*13*/ exit( -1 ); /*14*/ } /*15*/ if( Q->Front != 0 ) /*16*/ FixWraparound( Q ); /*17*/ } /*18*/ Q->Back = Increment( Q->Back, Q->MaxSize ); /*19*/ Q->Array[ Q->Back ] = X; /*20*/ Q->Size++; /*21*/ }