A car garage simulation using de-queue

/* a car garage simulation using de-queue (link list implementation) */

Suppose Fundu Parking Garage contains 10 parking lanes, each with a capacity to hold 10 cars at a time. As each car arrives/departs, the values A/D (representing arrival /departure) is entered along with the car registration number. If a car is departing the data should get updated. If a new car is arriving then on the screen a message should be displayed indicating suitable parking slot for the car. Cars arrive at the south end of the garage and leave from the north end. If a customer arrives to pick up a car that is not the nothernmost, all cars to the north of the car are moved out, the car is driven out, and the other cars are restored in the same order that they were in originally. Whenever a car leaves, all cars to the south are moved forward so that at all times all the empty spaces are in the south part of the garage. Write a program that implements this parking system.

#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>

#define TOP 1
#define BOT 2

struct node
{
char plate [15] ;
struct node *link ;
} *front[5], *rear[5] ;

char plate[15], temp[15] ;
int i ;

void add_dq ( struct node**, struct node**, int, char* ) ;
char* del_dq ( struct node**, struct node**, int ) ;
void push ( struct node**, char* ) ;
char* pop ( struct node** ) ;
void q_display ( struct node * ) ;

void main( )
{
char ad ;
int s, lane = -1, min, lc ;

clrscr( );
while ( 1 )
{
for ( i = 0 ; i < 5 ; i++ )
{
printf( "lane %d: ", i ) ;
q_display ( front[i] ) ;
}

printf( "\nArrival/Departure/Quit? ( A/D/Q ): " ) ;
ad = getch( ) ;

if ( toupper ( ad ) == 'Q' )
exit ( 1 ) ;

printf ( "\nEnter license plate num:" ) ;
gets ( plate ) ;
ad = toupper ( ad ) ;

if ( ad == 'A' ) /* arrival of car */
{
lane = -1 ; /* assume no lane is available */
min = 10 ;
for ( i = 0 ; i < 5 ; i++ )
{
s = count ( front[i] ) ;
if ( s < min )
{
min = s ;
lane = i ;
}
}

if ( lane == -1 )
printf ( "\nNo room available" ) ;
else
{
add_dq ( &front[ lane ], &rear[ lane ], BOT, plate ) ;
printf ( "\npark car at lane %d slot %d\n", lane, s ) ;
}
}
else
{
if ( ad == 'D' ) /* departure of car */
{
for ( i = 0 ; i < 5 ; ++i )
{
s = search ( front[i], plate ) ;
if ( s != -1 )
{
lane = i ;
break ;
}
}
if ( i == 5 )
printf ( "\nno such car!!\n" ) ;
else
{
printf ( "\ncar found at lane %d slot %d\n", lane, s ) ;
del_dq ( &front[ lane ], &rear[ lane ], s ) ;
}
}
else
if ( ad == 'Q' )
exit ( 1 ) ;
}
}
}

/* adds a new element at the end of queue */
void add_dq ( struct node **f, struct node **r, int tb, char *p )
{
struct node *q ;
/* create new node */
q = ( struct node * ) malloc ( sizeof ( struct node ) ) ;
strcpy ( q -> plate, p ) ;
q -> link = NULL ;

/* if the queue is empty */
if ( *f == NULL )
*f = q ;
else
{
if ( tb == BOT )
( *r ) -> link = q ;
else
{
q -> link = *f ;
*f = q ;
return ;
}
}
*r = q ;
}

char* del_dq ( struct node **f, struct node **r, int n )
{
struct node *q, *top = NULL ;
/* if queue is empty */
if ( *f == NULL )
printf ( "queue is empty" ) ;
else
{
if ( n == 0 )
{
strcpy ( temp, ( *f ) -> plate ) ;
q = *f ;
*f = ( *f ) -> link ;
free ( q ) ;
return temp ;
}

/* locate node */
for ( i = 0 ; i < n ; i++ )
{
/* drive out cars */
push ( &top, ( *f ) -> plate ) ;

/* delete the node */
q = *f ;
*f = q -> link ;
free ( q ) ;
}

/* delete the nth node */
q = *f ;
*f = q -> link ;
free ( q ) ;

for ( i = 0 ; i < n ; i++ )
{
strcpy ( temp, pop ( &top ) ) ;

/* add the node */
add_dq ( f, r, TOP, temp ) ;
}
}
}

int count ( struct node *q )
{
int c = 0 ;

/* traverse the entire linked list */
while ( q!= NULL )
{
q = q -> link ;
c++ ;
}
return c ;
}

int search ( struct node *q, char *p )
{
int s = -1, c = 0 ;

while ( q != NULL )
{
if ( strcmp ( p, q -> plate ) == 0 )
{
s = c ;
break ;
}
else
{
q = q -> link ;
c++ ;
}
}
return ( s ) ;
}

/* adds a new element to the top of stack */
void push ( struct node **s, char* item )
{
struct node *q ;
q = ( struct node* ) malloc ( sizeof ( struct node ) ) ;
strcpy ( q -> plate, item ) ;
q -> link = *s ;
*s = q ;
}

/* removes an element from top of stack */
char* pop ( struct node **s )
{
struct node *q ;

/* if stack is empty */
if ( *s == NULL )
{
return NULL ;
}
else
{
q = *s ;
strcpy ( temp, q -> plate ) ;
*s = q -> link ;
free ( q ) ;
return ( temp ) ;
}
}

void q_display ( struct node *q )
{
while( q != NULL )
{
printf ( "%s", q -> plate ) ;
q = q -> link ;
}
printf ( "\n" ) ;
}

Hi I am Alfred.