*
#define IS_VALID(size_t num, size_t max)((num < max))
typedef struct pier{
char * docks;
size_t pierShips;
size_t numberOfDocks;
}TPier;
struct piersCDT{
TPier * piers;
size_t piersDim;
size_t piersSize;
}
piersADT newPiers(void){
piersADT new = calloc(1, struct piersCDT);
new->piers = calloc(1, TPier);
return new;
}
/*
* Agrega el muelle #dockNumber al puerto #pierNumber y retorna 1
* Falla si el muelle ya existe en el puerto o si el puerto no existe y retorna 0
* Un muelle inicia sin una embaración amarrada
* Se asume un bajo porcentaje de muelles libres para cada puerto
*/
size_t addPierDock(piersADT piers, size_t pierNumber, size_t dockNumber){
if (!IS_VALID(pierNumber, piers->piersSize) || IS_VALID(docksNumber, piers->piers[pierNumber].numberOfDocks)){
return 0;
}
//agrega el muelle
size_t aux = piers->piers[pierNumber]->numberOfDocks;
piers->piers[pierNumber]->numberOfDocks = dockNumber + 1;
piers->piers[pierNumber]->docks = realloc(piers->piers[pierNumber]->docks, sizeof(char) * piers->piers[pierNumber]->numberOfDocks);
for (int i = aux; i < piers->piers[pierNumber]->numberOfDocks; i++){
piers->piers[pierNumber]->docks[i] = 0; //inicializo en cero los muelles agregados (no estan ocupados)
}
return 1;
}
/*
* Amarra una embaración en el muelle #dockNumber del puerto #pierNumber y retorna 1
* Falla si el muelle ya estaba ocupado o si el muelle no existe en el puerto
* o si el puerto no existe y retorna 0
*/
size_t dockShip(piersADT piers, size_t pierNumber, size_t dockNumber){
if (!IS_VALID(pierNumber, piers->piersSize) || !IS_VALID(docksNumber, piers->piers[pierNumber].numberOfDocks) || piers->piers[pierNumber]->docks[dockNumber] == 1){
return 0;
}
piers->piers[pierNumber]->docks[dockNumber] = 1;
piers->piers[pierNumber]->pierShips++;
return 1;
}
/*
* Indica si hay una embarcación amarrada en el muelle #dockNumber del puerto #pierNumber
* Retorna:
* 1 si hay una embarcación amarrada
* 0 si no hay una embaración amarrada
* -1 si el muelle no existe en el puerto o si el puerto no existe
*/
int shipInDock(const piersADT piers, size_t pierNumber, size_t dockNumber){
if (!IS_VALID(pierNumber, piers->piersSize) || !IS_VALID(docksNumber, piers->piers[pierNumber].numberOfDocks))
return -1;
return piers->piers[pierNumber]->docks[dockNumber];
}
*
Esta bien?