#include #include typedef int Item; typedef struct node { Item data; struct node *next; } QueueNode; // by putting head inside struct we get single pointer to hodl that does not change when top changes typedef struct { QueueNode* head; QueueNode* tail; } QueueType;; QueueType* createQueue() { QueueType* s = malloc(sizeof(QueueType)); return s; } void enqueue(QueueType* q, Item i) { QueueNode* newNode = malloc(sizeof(QueueNode)); newNode->data = i; if(q->tail==NULL) { q->head=newNode; q->tail=newNode; } else { q->tail->next=newNode; q->tail=newNode; } } void showQ(QueueType* q) { QueueNode* qq=q->head; while(qq!=NULL) { printf("%d\n", qq->data); qq=qq->next; } } Item dequeue(QueueType* q) { QueueNode* oldTop; if (q->head==NULL) { Item i; return i; } oldTop = q->head; q->head = oldTop->next;; Item d = oldTop->data; free(oldTop); return d; } int main(void) { QueueType * s1; s1 = createQueue(); enqueue(s1, 5); enqueue(s1, 10); enqueue(s1, 20); enqueue(s1, 40); enqueue(s1, 80); enqueue(s1, 160); showQ(s1); printf("%d\n", dequeue(s1)); printf("%d\n", dequeue(s1)); }