This is a second part to my first post about Arrays and Linked lists. Here I have (finally) implemented and tested two separate queues. Notice that you probably wouldn't need a queue structure if you are utilizing only one queue. The queue structure is so that I can use several different queues. Lots and lots of comments to guide you through:
#include <stdio .h> #include <stdlib .h> typedef struct mynode{ //this is the node structure, which includes a data int int data; //and a pointer to the next node struct mynode* next; }node; typedef struct{ //this is the queue structure, which includes a head and tail pointer. node* head; //a head and a tail pointer points to the first and last nodes of a queue node* tail; }queue; void enqueue(queue* que, int new_data); //here a list of the function prototypes void dequeue(queue* que); int take_queue_data(queue* que); void print(queue* que); int main() //main function to test out { //test cases hereeee queue* testq1 = (queue*)malloc(sizeof(queue)); queue* testq2 = (queue*)malloc(sizeof(queue)); enqueue(testq1, 1); print(testq1); enqueue(testq2, 2); print(testq2); enqueue(testq1, 3); print(testq1); enqueue(testq2, 4); print(testq2); enqueue(testq1, 5); print(testq1); enqueue(testq2, 6); print(testq2); dequeue(testq1); print(testq1); dequeue(testq2); print(testq2); dequeue(testq1); print(testq1); dequeue(testq2); print(testq2); dequeue(testq1); print(testq1); dequeue(testq2); print(testq2); } void enqueue(queue* que, int new_data){ node* tmp = (node*)malloc(sizeof(node)); //make a temporary node tmp->data = new_data; //set the node->data to what we want to insert tmp->next = NULL; //the next of that node would just be the nothing. if (que->head == NULL && que->tail == NULL){// if queue is empty que->head = tmp;// here we set the head and tail to this one node que->tail = tmp;// because this is the first node ever } else{ //if queue isnt empty, then just set it as the new tail. (que->tail)->next = tmp; que->tail = tmp;// and then remember to link this node to the last one's "next" pointer } return; }//end of enqueue void dequeue(queue* que){ node* tmp = que->head; //temporary for head of queue if (que->head == NULL){ //in case queue is empty printf("Queue is empty! \n"); return; } else if(que->head == que->tail){ que->head = NULL; //delete that last element que->tail = NULL; //and everything back to NULL } else{//there is more than one element in queue que->head = (que->head)->next; } free(tmp); //we cant hold on to this mem space forever, or cannnnn we. :( }// end of dequeue int take_queue_data(queue* que){//this will give us the first data in queue if(que->head == NULL){ printf("Queue is empty, nothing to look at."); return 0; } else{ return (que->head)->data; } } void print(queue* que){//this is to look at whole queue node* tmp = que->head; //set tmp to the front of the queue to walk while(tmp != NULL){ printf("%d ", tmp->data); tmp = tmp->next; } printf("\n"); }
I hope this helps you understand a linked list better(or how to implement it). Remember there is a doubly linked list too, and it's simple to implement with a alittle tweaking of this code. :D
If you see any problems, have any suggestions, or have any questions feel free to ask in the comments below!