C Data Structure: Dynamic Queue Impl

#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));
}

Leave a Reply

Your email address will not be published. Required fields are marked *