diff --git a/Assignment4/.idea/.gitignore b/Assignment4/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/Assignment4/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/Assignment4/.idea/Assignment4.iml b/Assignment4/.idea/Assignment4.iml
new file mode 100644
index 0000000..f08604b
--- /dev/null
+++ b/Assignment4/.idea/Assignment4.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/Assignment4/.idea/codeStyles/codeStyleConfig.xml b/Assignment4/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000..a55e7a1
--- /dev/null
+++ b/Assignment4/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Assignment4/.idea/misc.xml b/Assignment4/.idea/misc.xml
new file mode 100644
index 0000000..79b3c94
--- /dev/null
+++ b/Assignment4/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Assignment4/.idea/modules.xml b/Assignment4/.idea/modules.xml
new file mode 100644
index 0000000..112b71c
--- /dev/null
+++ b/Assignment4/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Assignment4/.idea/vcs.xml b/Assignment4/.idea/vcs.xml
new file mode 100644
index 0000000..6c0b863
--- /dev/null
+++ b/Assignment4/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Assignment4/CMakeLists.txt b/Assignment4/CMakeLists.txt
new file mode 100644
index 0000000..204584b
--- /dev/null
+++ b/Assignment4/CMakeLists.txt
@@ -0,0 +1,12 @@
+cmake_minimum_required(VERSION 3.22)
+project(Assignment4 C)
+
+set(CMAKE_C_STANDARD 99)
+
+add_executable(Assignment4
+ round_robin.c
+ lib/queue.h
+ lib/queue.c
+ lib/process.h
+ lib/process.c
+)
diff --git a/Assignment4/documentation/Assignment 4-v2.pdf b/Assignment4/documentation/Assignment 4-v2.pdf
new file mode 100644
index 0000000..9560c23
Binary files /dev/null and b/Assignment4/documentation/Assignment 4-v2.pdf differ
diff --git a/Assignment4/documentation/a4_sample_input_1.txt b/Assignment4/documentation/a4_sample_input_1.txt
new file mode 100644
index 0000000..249e5e4
--- /dev/null
+++ b/Assignment4/documentation/a4_sample_input_1.txt
@@ -0,0 +1,6 @@
+3
+User Process Arrival Duration
+Jim A 2 5
+Mary B 2 2
+Sue C 5 5
+Mary D 6 2
diff --git a/Assignment4/documentation/a4_sample_input_2.txt b/Assignment4/documentation/a4_sample_input_2.txt
new file mode 100644
index 0000000..8d886da
--- /dev/null
+++ b/Assignment4/documentation/a4_sample_input_2.txt
@@ -0,0 +1,7 @@
+3
+User Process Arrival Duration
+Jim A 2 5
+Mary B 2 2
+Mary D 6 2
+Sue C 7 5
+Hassan E 22 3
diff --git a/Assignment4/documentation/a4_sample_output_1.txt b/Assignment4/documentation/a4_sample_output_1.txt
new file mode 100644
index 0000000..ac3d5d0
--- /dev/null
+++ b/Assignment4/documentation/a4_sample_output_1.txt
@@ -0,0 +1,22 @@
+Time Job
+1 -
+2 A
+3 A
+4 A
+5 B
+6 B
+7 A
+8 A
+9 C
+10 C
+11 C
+12 D
+13 D
+14 C
+15 C
+16 -
+
+Summary
+Jim 8
+Mary 13
+Sue 15
diff --git a/Assignment4/documentation/a4_sample_output_2.txt b/Assignment4/documentation/a4_sample_output_2.txt
new file mode 100644
index 0000000..892ad91
--- /dev/null
+++ b/Assignment4/documentation/a4_sample_output_2.txt
@@ -0,0 +1,32 @@
+Time Job
+1 -
+2 A
+3 A
+4 A
+5 B
+6 B
+7 A
+8 A
+9 D
+10 D
+11 C
+12 C
+13 C
+14 C
+15 C
+16 -
+17 -
+18 -
+19 -
+20 -
+21 -
+22 E
+23 E
+24 E
+25 -
+
+Summary
+Jim 8
+Mary 10
+Sue 15
+Hassan 24
diff --git a/Assignment4/lib/process.c b/Assignment4/lib/process.c
new file mode 100644
index 0000000..5e7215a
--- /dev/null
+++ b/Assignment4/lib/process.c
@@ -0,0 +1,36 @@
+#include
+#include
+#include
+#include "process.h"
+
+//Assume that the string passed in is null terminated
+
+Process *createProcess(char *username, char job, int arrival_time, int duration) {
+ // Allocate memory for the process, and check if it was successful
+ Process *node = calloc(1, sizeof(Process));
+ if (node == NULL) {
+ printf("Error allocating memory for process\n");
+ exit(EXIT_FAILURE);
+ }
+ // Free the data first, then allocate memory for the new data
+ node->username = calloc(strlen(username) + 1, sizeof(char));
+ if (node->username == NULL) {
+ printf("Error allocating memory for username data\n");
+ exit(EXIT_FAILURE);
+ }
+ // Copy data from the string passed in to the process's data
+ // Makes sure if the string passed in is changed, the process's data is not changed
+ // Also makes sure that if the data is on the stack, it is not freed at some other point
+ strcpy(node->username, username);
+ node->job = job;
+ node->arrival_time = arrival_time;
+ node->duration = duration;
+ node->next_elem = NULL;
+ return node;
+}
+
+void destroyProcess(Process *node) {
+ // Free the data first, then free the process
+ free(node->username);
+ free(node);
+}
diff --git a/Assignment4/lib/process.h b/Assignment4/lib/process.h
new file mode 100644
index 0000000..e4bba60
--- /dev/null
+++ b/Assignment4/lib/process.h
@@ -0,0 +1,17 @@
+#ifndef NODE_H
+#define NODE_H
+
+typedef struct Process {
+ struct process *prev_elem;
+ struct process *next_elem;
+ char *username;
+ char job;
+ int arrival_time;
+ int duration;
+} Process;
+
+Process *createProcess(char *username, char job, int arrival_time, int duration);
+
+void destroyProcess(Process *node);
+
+#endif //NODE_H
diff --git a/Assignment4/lib/queue.c b/Assignment4/lib/queue.c
new file mode 100644
index 0000000..a11a0d9
--- /dev/null
+++ b/Assignment4/lib/queue.c
@@ -0,0 +1,109 @@
+#include
+#include
+#include
+#include
+#include
+#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;
+}
+
diff --git a/Assignment4/lib/queue.h b/Assignment4/lib/queue.h
new file mode 100644
index 0000000..37dca9d
--- /dev/null
+++ b/Assignment4/lib/queue.h
@@ -0,0 +1,27 @@
+#ifndef QUEUE_H
+#define QUEUE_H
+
+#include
+#include "process.h"
+
+typedef struct Queue {
+ Process *start;
+ Process *end;
+ int size;
+} Queue;
+
+int contains(Queue *queue, char *job);
+
+Process *search(Queue *queue, char *job);
+
+void enqueue(Queue *queue, Process *process);
+
+Process *dequeue(Queue *queue);
+
+void printList(Queue *queue);
+
+int stop(Queue *queue);
+
+Queue* createQueue();
+
+#endif //QUEUE_H
diff --git a/Assignment4/round_robin.c b/Assignment4/round_robin.c
new file mode 100644
index 0000000..064f450
--- /dev/null
+++ b/Assignment4/round_robin.c
@@ -0,0 +1,53 @@
+#include
+#include "lib/queue.h"
+
+#define MAX_USERNAME_LENGTH 100
+int QUANTUM;
+
+typedef struct Summary {
+ char username[MAX_USERNAME_LENGTH];
+ int last_time;
+} Summary;
+
+Queue* input_queue() {
+ Queue* queue = createQueue();
+
+ scanf("%d", &QUANTUM);
+ char username[MAX_USERNAME_LENGTH];
+ char job;
+ int arrival_time, duration;
+ while(scanf("%s100 %c %d %d", username, &job, &arrival_time, &duration) != EOF) {
+ Process *process = createProcess(username, job, arrival_time, duration);
+ enqueue(queue, process);
+ }
+ return queue;
+}
+
+
+void simulation(Queue* queue) {
+ printf("Time\tJob\n");
+ int time = 0;
+ Queue *sim_queue = createQueue();
+
+ //Take note of all usernames at the start, and then create an array of summary
+ //When a job finishes, take note of its username, and then go through the array of summary and find the username
+ //Once you find the username, assign the last_time to the current time.
+ //TODO: May need to change as the summary should be sorted by username arrival time
+
+ //Go through list and check for arrival times at current time
+ //If arrival time is at current time, add to sim_queue
+ //If there is nothing in sim_queue, print -
+ //If there is something in sim queue, store the process in a variable, so we can check the quantum
+ //If the quantum is 0, then we need to dequeue the process and enqueue it again
+ //If the quantum is not 0, then we need to print the process and decrement the quantum
+ //If the process is done, then we need to print the process and dequeue it
+ //If the process is not done, then we need to print it and leave the queue alone
+ //Once we reach the point where time is greater than the last arrival time, we need to check if sim_queue is empty
+ //Once sim_queue is empty, we need to break out of the loop
+
+
+}
+
+int main() {
+ Queue* input = input_queue();
+}