Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME 30
void InputFile (char* input_file);
void BookingSystem (char* input_file);
struct passenger
{
char name[2*MAX_NAME + 1];
int flydate; //Flight date
int seat;
struct passenger *next;
};
int seats[31][8];
typedef struct passenger passenger;
passenger* AddNode (char *name, int flydate, passenger *head);
passenger* DeleteNode(char *name, int flydate, passenger *head);
//passenger* passengerInfo(FILE *input_stream, int passengers_registered, int exam_number, passenger *head);
//void passengerDisplay (passenger *head, int exam_number);
void fill_seats();
int seat_alloc(int flydate);
void seat_taken(int i, int j);
void seat_returned(int i, int j);
void ConfirmBook(char *name, int flydate, passenger *head);
void PList(int date, passenger *head);
void Display (passenger *head);
void SeatList(int date);
int main ()
{
char input_file[BUFSIZ];
InputFile(input_file);
BookingSystem(input_file);
getchar();
getchar();
return 0;
}
void InputFile (char* input_file)
{
printf("Enter the name of the file containing the booking information.\n");
scanf("%s", input_file); //Retrieving filename from user
return;
}
void BookingSystem (char* input_file) //Collect necessary information from file and use it for booking system
{
FILE *input_stream;
char *file = input_file;
//Variables to hold information from input file
int command;
int date;
char dest[31];
char fname[31];
char lname[31];
char *name;
int counter = 0;
passenger *head = NULL; //Creation of Head for Sorted Linked List
head = malloc(sizeof(passenger));
head = NULL;
//Filling seats
fill_seats();
if ( (input_stream = fopen(input_file, "r")) == NULL )
{
printf("Could not open file.\n\n");
return;
}
puts("");
while ( !(feof(input_stream)))
{
fscanf(input_stream, "%d", &command);
counter++;
if ( counter % 3 == 0 )
{
counter = 0;
puts("");
}
switch ( command )
{
case 1: fscanf(input_stream, "%s", dest);
fscanf(input_stream, "%d", &date);
fscanf(input_stream, "%s", lname);
fscanf(input_stream, "%s", fname);
strcpy(lname + strlen(lname), " ");
name = strcat(lname, fname);
head = AddNode(name, date, head);
break;
case 2: fscanf(input_stream, "%s", dest);
fscanf(input_stream, "%d", &date);
fscanf(input_stream, "%s", lname);
fscanf(input_stream, "%s", fname);
strcpy(lname + strlen(lname), " ");
name = strcat(lname, fname);
head = DeleteNode(name, date, head);
break;
case 3: fscanf(input_stream, "%s", dest);
fscanf(input_stream, "%d", &date);
fscanf(input_stream, "%s", lname);
fscanf(input_stream, "%s", fname);
strcpy(lname + strlen(lname), " ");
name = strcat(lname, fname);
ConfirmBook(name, date, head);
break;
case 4: fscanf(input_stream, "%s", dest);
fscanf(input_stream, "%d", &date);
PList(date, head);
break;
default: printf("Not handled yet.\n");
break;
case 5: fscanf(input_stream, "%s", dest);
fscanf(input_stream, "%d", &date);
SeatList(date);
break;
case 6: printf("Good Bye!");
fclose(input_stream);
return;
}
}
fclose(input_stream);
return;
}
passenger* AddNode (char *name, int flydate, passenger *head)
{
passenger *node, *temp;
temp = head;
node = malloc(sizeof(passenger));
if ( !seat_alloc(flydate) )
{
printf("\nSorry, All seats booked for flight ZM101 for date %d.\n", flydate);
return head;
}
node->seat = seat_alloc(flydate);
seat_taken(flydate, node->seat);
node->flydate = flydate;
strcpy(node->name,name);
if ( head == NULL ) //In case the list is empty
{
node->next = NULL;
head = node;
printf("%s booked on ZM101 May %d seat %d.\n", node->name, node->flydate, node->seat);
return head;
}
if ( head->next == NULL ) //Case when there is only one node present
{
if ( (strcmp(name, head->name) == -1) )
{
node->next = head;
head = node;
printf("%s booked on ZM101 May %d seat %d.\n", node->name, node->flydate, node->seat);
return head;
}
else
{
head->next = node;
node->next = NULL;
printf("%s booked on ZM101 May %d seat %d.\n", node->name, node->flydate, node->seat);
return head;
}
}
if ( (strcmp(name, head->name) == -1) ) //Case where the addition is lexically greater than the head
{
node->next = head;
head = node;
printf("%s booked on ZM101 May %d seat %d.\n", node->name, node->flydate, node->seat);
return head;
}
else
{
while ( (strcmp(name, temp->next->name) != -1) && (temp->next != NULL) )
{
if ( temp == NULL) break;
temp = temp->next;
}
if ( (temp->next == NULL) && (strcmp(name, temp->next->name) == -1) )
{
node->next = temp->next;
temp = node;
printf("%s booked on ZM101 May %d seat %d.\n", node->name, node->flydate, node->seat);
return head;
}
if ( temp->next == NULL )
{
temp->next = node;
node->next = NULL;
printf("%s booked on ZM101 May %d seat %d.\n", node->name, node->flydate, node->seat);
return head;
}
if ( strcmp(name, temp->next->name) == -1 )
{
node->next = temp->next;
temp = node;
printf("%s booked on ZM101 May %d seat %d.\n", node->name, node->flydate, node->seat);
return head;
}
}
}
passenger* DeleteNode(char *name, int flydate, passenger *head)
{
passenger *temp;
temp = head;
if ( (strcmp(name, head->name) == 0) && head->flydate == flydate ) //Head Deletion
{
head = head->next;
printf("Booking canceled for %s on ZM101 May %d seat %d.\n", temp->name, temp->flydate, temp->seat);
seat_returned(flydate, temp->seat);
free(temp);
return head;
}
if( head->next == NULL ) //One Node
{
if ( (strcmp(name, head->name) == 0) && head->flydate == flydate )
{
head = NULL;
printf("Booking canceled for %s on ZM101 May %d seat %d.\n", temp->name, temp->flydate, temp->seat);
free(temp);
seat_returned(flydate, temp->seat);
return head;
}
printf("Reservation not found, could not be canceled.\n");
return head;
}
while ( temp->next != NULL && ((strcmp(name, temp->next->name) != 0) && (temp->next->flydate != flydate) ) )
{
temp = temp->next;
}
if (temp->next == NULL )
{
if ( (strcmp(name, temp->name) == 0) && (temp->flydate == flydate) )
{
temp = NULL;
printf("Booking canceled for %s on ZM101 May %d seat %d.\n", temp->name, temp->flydate, temp->seat);
seat_returned(flydate, temp->seat);
return head;
}
printf("Reservation not found, could not be canceled.\n");
return head;
}
if ( (strcmp(name, temp->next->name) == 0) && (temp->next->flydate == flydate) )
{
temp = temp->next->next;
free(temp->next);
printf("Booking canceled for %s on ZM101 May %d seat %d.\n", temp->next->name, temp->next->flydate, temp->next->seat);
seat_returned(flydate, temp->seat);
return head;
}
printf("Reservation not found, could not be canceled.\n");
return head;
}
int seat_alloc(int flydate)
{
int i;
for ( i = 0; i < 8; i++ )
{
if ( seats[flydate-1][i] != 0 )
return seats[flydate-1][i];
}
return 0; //Cycled through all seats, and all of them are zero
}
void fill_seats()
{
int i, j;
int x = 1;
int k = 0;
for ( i = 0; i < 31; i++ )
for ( j = 0; j < 8; j++ )
{
seats[i][j] = x;
x++; //Continue to increment x in order to fill up seats properly
k++; //Counter to know when to reset x to one again
if ( k % 8 == 0 )
x = 1;
}
}
void seat_taken(int i, int j)
{
seats[i-1][j-1] = 0;
return;
}
void seat_returned(int i, int j)
{
seats[i-1][j-1] = j;
return;
}
void ConfirmBook(char *name, int flydate, passenger *head)
{
while ( head != NULL )
{
if ( (strcmp(name, head->name) == 0) && (flydate == head->flydate) )
{
printf("Yes, booking confirmed for %s for flight ZM101 for May %d.\n", name, flydate);
return;
}
head = head->next;
}
printf("No, booking is not confirmed for %s for flight ZM101 for May %d.\n", name, flydate);
return;
}
void PList(int date, passenger *head)
{
printf("\nPassenger list for ZM101 May %d\n", date);
while ( head != NULL )
{
if ( head->flydate == date )
{
printf("\t%s %d\n", head->name, head->seat);
}
head = head->next;
}
printf("\n");
}
void Display (passenger *head)
{
while ( head != NULL )
{
printf("%s %d %d", head->name, head->flydate, head->seat);
head = head->next;
}
}
void SeatList(int date)
{
printf("Seat list for May %d [%d %d ", date, seats[date-1][0], seats[date-1][1]);
printf("%d %d ", seats[date-1][2], seats[date-1][3]);
printf("%d %d %d %d]\n", seats[date-1][4],seats[date-1][5], seats[date-1][6], seats[date-1][7]);
}
I can't figure out the problem with this code. I suspect it to be in the bold parts.