I'd truly be grateful for insightful feedback on the following functions. Please note that I was instructed to declare the functions the way they are declared, so comments regarding the names and/or types of the variables would simply be irrelevant.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct driver{
char name[101];
int priority;
struct driver* next;
}Driver;
typedef struct order{
int orderID;
int isSpecific;
char specificDriver[101];
struct order* next;
}Order;
typedef struct taxiSystem{
Driver * driversQueue;
Order * ordersQueue;
int numOrder;
}TaxiSystem;
int addDriver(TaxiSystem * system, char * name, int priority);
int doesDriverExist(Driver * iter, char * name);
int findOrderByName(Order * iter, char * name);
void EraseOrder(Order ** iter, int ID);
void eraseFirstOrderHelper(Order ** iter);
void eraseOrderHelper(Order * prv);
int isNotSpecificOrder(Order ** iter);
int createDriverAndAddByPriority(TaxiSystem * system, char * name, int priority);
int main(){
return 0;
}
int addDriver(TaxiSystem * system, char * name, int priority){
int order;
int spec;
if (doesDriverExist(system->driversQueue, name))
return 1;
order = findOrderByName(system->ordersQueue, name);
if (order){
EraseOrder(&system->ordersQueue, order);
return 1;
}
spec = isNotSpecificOrder(&system->ordersQueue);
if (system->driversQueue == NULL && spec != 0)
EraseOrder(&system->ordersQueue, spec);
return(createDriverAndAddByPriority(system, name, priority));
}
int doesDriverExist(Driver * iter, char * name){
if (iter == NULL)
return 0;
return (strcmp(iter->name, name) == 0 || doesDriverExist(iter->next, name));
}
int findOrderByName(Order * iter, char * name){
if (iter == NULL)
return 0;
return (strcmp(iter->specificDriver, name) == 0 ? iter->orderID : findOrderByName(iter->next, name));
}
void EraseOrder(Order ** iter, int ID){
Order * cur = *iter, *prv = NULL;
if (cur->orderID == ID) eraseFirstOrderHelper(iter);
while (cur->orderID != ID && cur != NULL){
prv = cur;
cur = cur->next;
}
if (cur != NULL) eraseOrderHelper(prv);
}
void eraseFirstOrderHelper(Order ** iter){
Order * tmp = *iter;
*iter = tmp->next;
free(tmp);
}
void eraseOrderHelper(Order * prv){
Order * tmp = prv->next;
prv->next = tmp->next;
free(tmp);
}
int isNotSpecificOrder(Order ** iter){
Order * tmp = *iter;
while (tmp->isSpecific && tmp != NULL)
tmp = tmp->next;
if (tmp == NULL) return 0;
return (tmp->orderID);
}
int createDriverAndAddByPriority(TaxiSystem* system, char* name, int priority){
Driver *new_node = NULL, *cur = NULL, *prv = NULL;
new_node = (Driver*) malloc(sizeof(Driver));
if (new_node == NULL){
printf("Fatal error: memory allocation failed!\n");
return EXIT_FAILURE;
}
strcpy(new_node->name, name);
new_node->priority = priority;
cur = system->driversQueue;
while (cur && (cur->priority < new_node->priority)){
prv = cur;
cur = cur->next;
}
prv->next = new_node;
new_node->next = cur->next;
free(cur);
return EXIT_SUCCESS;
}