#include <stdlib.h>
#include <stdio.h>
/**
* Author: Ozan Özenoğlu
* Date : 10/10/2020
* */
struct queue_node {
struct queue_node *next;
int val;
};
typedef struct queue_node queue_node_t;
struct queue {
int size;
queue_node_t *first;
queue_node_t *last;
};
typedef struct queue queue_t;
void init(queue_t *queue){
queue->size = 0;
queue->first = (void*)0;
queue->last = (void*)0;
printf("queue is initialized!\n");
}
void add(queue_t *queue, int val) {
queue_node_t *node = malloc(sizeof(queue_node_t)*1);
node->val = val;
printf("node val is added %d\n",node->val);
queue->size++;
printf("queue size is increased\n");
node->next = (void*)0;
printf("node->next is updated as null!\n");
if(queue->last != (void*)0) { // if it is not first node else last would be null and we get segfault.
queue->last->next = node;
} else {
queue->first = node; // update first node
}
queue->last = node;
printf("queue last node is updated\n");
printf("%d is added, queue size is %d\n",val , queue->size);
}
int get(queue_t *queue) {
if(queue->size == 0) {
return -1;
}
int result = queue->first->val;
queue_node_t *first = queue->first;
if(queue->first->next != (void*)0) {
queue->first = queue->first->next;
} else {
queue->first = (void*)0;
}
queue->size--;
free(first);
printf("returning result is %d\n",result);
return result;
}
int main() {
queue_t my_queue;
init(&my_queue);
add(&my_queue, 1);
add(&my_queue, 2);
add(&my_queue, 3);
add(&my_queue, 4);
printf("%d\n",get(&my_queue));
printf("%d\n",get(&my_queue));
printf("%d\n",get(&my_queue));
printf("%d\n",get(&my_queue));
printf("%d\n",get(&my_queue));
printf("%d\n",get(&my_queue));
}