110 lines
2.9 KiB
C
110 lines
2.9 KiB
C
|
#include <stdio.h>
|
||
|
#include <stddef.h>
|
||
|
#include <stdbool.h>
|
||
|
#include <string.h>
|
||
|
#include <stdlib.h>
|
||
|
#include "process.h"
|
||
|
#include "queue.h"
|
||
|
|
||
|
/*
|
||
|
* Queue implementation
|
||
|
* 5 4 3 2 1
|
||
|
* START END
|
||
|
*
|
||
|
* If you were to visualize the queue as a line, the end is the first person in line and the start is the last person in line
|
||
|
* So when you enqueue, you are adding to the start of the line
|
||
|
* And when you dequeue, you are exiting from the end of the line
|
||
|
*/
|
||
|
|
||
|
//TODO: Refactor
|
||
|
int contains(Queue *queue, char *job) {
|
||
|
Process *current = queue->start;
|
||
|
while (current != NULL) {
|
||
|
if (strcmp(current->username, job) == 0) {
|
||
|
return true;
|
||
|
}
|
||
|
current = current->next_elem;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
//TODO: Refactor
|
||
|
Process *search(Queue *queue, char *job) {
|
||
|
Process *current = queue->start;
|
||
|
|
||
|
while (current != NULL) {
|
||
|
if (strcmp(current->username, job) == 0) {
|
||
|
return current;
|
||
|
}
|
||
|
current = current->next_elem;
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
void enqueue(Queue *queue, Process *process) {
|
||
|
if (queue->end == NULL) { // If the queue is empty, set the start and end to the new process
|
||
|
queue->end = process;
|
||
|
queue->start = queue->end;
|
||
|
} else {
|
||
|
process->next_elem = queue->start; // Set the next element of the new process to the start of the queue
|
||
|
queue->start->prev_elem = process; // Set the previous element of the start of the queue to the new process
|
||
|
queue->start = process; // Set the start of the queue to the new process
|
||
|
}
|
||
|
queue->size++;
|
||
|
}
|
||
|
|
||
|
|
||
|
// WARNING: Returns a pointer to a process that is not in the queue, it is your responsibility to free it
|
||
|
Process *dequeue(Queue *queue) {
|
||
|
if (queue->end == NULL) { // If the queue is empty, return NULL
|
||
|
return NULL;
|
||
|
}
|
||
|
Process *temp = queue->end; // Store the end of the queue for returning later
|
||
|
|
||
|
queue->end = queue->end->prev_elem; // Set the end to the previous element
|
||
|
queue->end->next_elem = NULL; // Set the next element of the new end to NULL
|
||
|
|
||
|
if (queue->end == NULL) { // If the queue is empty, set the start to NULL
|
||
|
queue->start = NULL;
|
||
|
}
|
||
|
|
||
|
temp->prev_elem = NULL; // The dequeued element should not point to anything
|
||
|
queue->size--;
|
||
|
return temp;
|
||
|
}
|
||
|
|
||
|
//TODO: Refactor
|
||
|
void printList(Queue *queue) {
|
||
|
Process *current = queue->start;
|
||
|
while (current != NULL) {
|
||
|
// printf("%s %d\n", current->username, current->duration);
|
||
|
current = current->next_elem;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//TODO: Refactor
|
||
|
int stop(Queue *queue) {
|
||
|
Process *current = queue->end;
|
||
|
while (current != NULL) {
|
||
|
Process *next = current->prev_elem;
|
||
|
destroyProcess(current);
|
||
|
current = next;
|
||
|
}
|
||
|
free(queue);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
Queue *createQueue() {
|
||
|
Queue *queue = calloc(1, sizeof(Queue));
|
||
|
if (queue == NULL) {
|
||
|
printf("Error allocating memory for queue\n");
|
||
|
exit(EXIT_FAILURE);
|
||
|
}
|
||
|
queue->start = NULL;
|
||
|
queue->end = NULL;
|
||
|
queue->size = 0;
|
||
|
return queue;
|
||
|
}
|
||
|
|