12-tower-of-hanoi/toh_disk.c
2025-01-19 09:22:49 +01:00

82 lines
No EOL
2.1 KiB
C

/*----------------------------------------------------------
* HTBLA-Leonding / Class: 2IHIF
* ---------------------------------------------------------
* Exercise Number: 09
* Title: Tower of Hanoi Disk ADT Implemenation
* Author: Marc Tismonar
* ----------------------------------------------------------
* Description:
* Implementation of toh_disk.h.
* ----------------------------------------------------------
*/
#include "toh_disk.h"
#include "config.h"
#include <stdlib.h>
struct DiskData {
unsigned short size;
};
/**
* Provides the instance of the disk with the given size.
* Valid disk sizes are from 1 to MAX_DISKS.
*
* @param size The size of the desired disk.
* @return The disk of the given size or 0,
* if no such disk is available.
*/
Disk td_get_disk(unsigned short size) {
if(size < 1 || size > MAX_DISKS) {
return 0;
}
Disk disk = (Disk)calloc(sizeof(struct DiskData), 1);
disk->size = size;
return disk;
}
/**
* Determines whether or not the given disk is valid.
* It is valid if it is not 0 and has a size between 1 and MAX_DISKS.
*
* @param disk The disk in focus of this ADT.
* @return True if the disk is valid, false otherwise.
*/
bool td_is_valid(Disk disk) {
if (disk == 0 || disk->size < 1 || disk->size > MAX_DISKS) {
return false;
}
return true;
}
/**
* Provides the size of the given disk.
*
* @param disk The disk in focus of this ADT.
* @return The size of the disk, if it is valid or 0 otherwise.
*/
unsigned short td_get_size(Disk disk) {
if (!td_is_valid(disk)) {
return 0;
}
return disk->size;
}
/**
* Compares the size of the candidate disk with size of the given disk.
*
* @param disk The disk in focus of this ADT.
* @param smaller_candidate The disk to evaluate.
* @return True if the 'smaller_candidate' disk is smaller than the
* given disk of this ADT and both disks are valid, false otherwise.
*/
bool td_is_smaller(Disk disk, Disk smaller_candidate) {
if (!td_is_valid(disk) || !td_is_valid(smaller_candidate)) {
return false;
}
return disk->size > smaller_candidate->size;
}