82 lines
No EOL
2.1 KiB
C
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;
|
|
} |