105 lines
2.8 KiB
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;
|
|
}
|