#include #include typedef struct node { void* 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, void* 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* dequeue(QueueType* q) { QueueNode* oldTop; if (q->head==NULL) { return NULL; } oldTop = q->head; q->head = oldTop->next;; void* d = oldTop->data; free(oldTop); return d; } int* makeip(int i) { int* ip = malloc(sizeof(int)); *ip=i; return ip; } double* makedp(double d) { double* dp = malloc(sizeof(double)); *dp=d; return dp; } int main(void) { QueueType * s1; s1 = createQueue(); QueueType * s2; s2 = createQueue(); enqueue(s1, makeip(5)); enqueue(s1, makeip(10)); enqueue(s1, makeip(20)); enqueue(s1, makeip(40)); enqueue(s1, makeip(80)); enqueue(s1, makeip(180)); enqueue(s2, makedp(1.1)); enqueue(s2, makedp(2.2)); enqueue(s2, makedp(4.4)); enqueue(s2, makedp(8.8)); enqueue(s2, makedp(16.16)); enqueue(s2, makedp(32.32)); enqueue(s2, makedp(64.64)); enqueue(s2, makedp(128.128)); int* is = dequeue(s1); printf("S1 %d\n", *is); free(is); is = dequeue(s1); printf("S1 %d\n", *is); free(is); double* ds = dequeue(s2); printf("S2 %.3f\n", *ds); free(ds); ds = dequeue(s2); printf("S2 %.3f\n", *ds); free(ds); ds = dequeue(s2); printf("S2 %.3f\n", *ds); free(ds); ds = dequeue(s2); printf("S2 %.3f\n", *ds); free(ds); }