CS3413/Assignment8/code/disk.c

105 lines
2.8 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include "disk.h"
void destroyDiskQueue(DiskQueue *queue) {
free(queue->requests);
free(queue);
}
DiskQueue *sortQueueByPosition(DiskQueue *queue) {
qsort(queue->requests, queue->size, sizeof(DiskRequest), compareDiskRequestsByPosition);
return queue;
}
int compareDiskRequestsByPosition(const void *a, const void *b) {
DiskRequest *requestA = (DiskRequest *) a;
DiskRequest *requestB = (DiskRequest *) b;
return requestA->position - requestB->position;
}
DiskQueue *queueOfLesserTime(DiskQueue *queue, double time) {
DiskQueue *sameTimeQueue = createDiskQueue();
for (int i = 0; i < queue->size; i++) {
if (queue->requests[i].time <= time) {
enqueue(sameTimeQueue, queue->requests[i]);
}
}
return sameTimeQueue;
}
DiskRequest dequeue(DiskQueue *queue) {
return delete(queue, peek(queue));
}
DiskRequest peek(DiskQueue *queue) {
return queue->requests[0];
}
DiskQueue *clone(DiskQueue *queue) {
DiskQueue *clone = createDiskQueue();
for (int i = 0; i < queue->size; i++) {
enqueue(clone, queue->requests[i]);
}
return clone;
}
DiskRequest delete(DiskQueue *queue, DiskRequest request) {
// Find the index of the request
int index = -1;
for (int i = 0; i < queue->size; i++) {
if (queue->requests[i].position == request.position && queue->requests[i].time == request.time) {
index = i;
break;
}
}
if (index == -1) {
printf("Error: Request not found in queue\n");
exit(EXIT_FAILURE);
}
// Shift all the elements after the index down one
for (int i = index; i < queue->size - 1; i++) {
queue->requests[i] = queue->requests[i + 1];
}
// Resize the queue
queue->requests = realloc(queue->requests, sizeof(DiskRequest) * (queue->size - 1));
if (queue->requests == NULL) {
printf("Error reallocating memory for queue requests\n");
exit(EXIT_FAILURE);
}
queue->size--;
return request;
}
void enqueue(DiskQueue *queue, DiskRequest request) {
queue->requests = realloc(queue->requests, sizeof(DiskRequest) * (queue->size + 1));
if (queue->requests == NULL) {
printf("Error reallocating memory for queue requests\n");
exit(EXIT_FAILURE);
}
queue->requests[queue->size] = request;
queue->size++;
}
DiskRequest diskRequest(int position, int time) {
DiskRequest request;
request.position = position;
request.time = time;
return request;
}
DiskQueue *createDiskQueue() {
DiskQueue *queue = malloc(sizeof(DiskQueue));
if (queue == NULL) {
printf("Error allocating memory for queue\n");
exit(EXIT_FAILURE);
}
queue->requests = malloc(sizeof(DiskRequest));
if (queue->requests == NULL) {
printf("Error allocating memory for queue requests\n");
exit(EXIT_FAILURE);
}
queue->size = 0;
return queue;
}