Implementation of Priority Queue using Linked List in C
Implementation of Priority Queue using Linked List
In this post, we will learn to implement Priority Queue using Linked List It has the following methods –- Push()
- Pop()
- Peek()
Priority Queue using Linked List in C
Operations
- Push: Pushing/inserting a new item in the priority queue at a position in accordance with its priority
- Pop: Popping/removing a new item in the priority queue in accordance with its priority
- Peek: Displaying the topmost priority item of the queue
Note
A lower priority number for an item means higher priority.
Example: (item1, 2) and (item2, 5). Here is item one is higher priority as it has lower priority number,
Example: (item1, 2) and (item2, 5). Here is item one is higher priority as it has lower priority number,
Syntax for Priority Queue as Linked List
struct Node { int data; int priority; // lower value means higher priority struct Node* next; };
Advantage of implementing Priority Queue as Linked List over Array
- Implementation of priority Queue data by using a linked list is more efficient as compared to arrays.
- The linked list provides you with the facility of Dynamic memory allocation.
- The memory is not wasted as memory, not in use can be freed, using free(); method
C Program to Implement Priority Queue using Linked list
Code in C
Run
#include<stdio.h> #include<stdlib.h> struct Node { int data; int priority; // lower value means higher priority struct Node* next; }; // Function to Create A New Node struct Node* create(int data, int priorityVal) { struct Node* temp = (struct Node*) malloc(sizeof(struct Node)); temp->data = data; temp->priority = priorityVal; temp->next = NULL; return temp; } // Return the value at head int peek(struct Node** head) { return (*head)->data; } // Function to push in accodance with priority void push(struct Node** head, int data, int priorityVal) { struct Node* curr = (*head); // Create new Node struct Node* temp = create(data, priorityVal); // If incoming node has lower priority value // than the current head. This incoming node // is inserted before head // Note: Lower priority value means higher priority if ((*head)->priority > priorityVal) { // new node inserted before head temp->next = *head; (*head) = temp; } else { // else we traverse the list to find // correct position to insert the incoming node while (curr->next != NULL && curr->next->priority < priorityVal) { curr = curr->next; } // incoming node inserted here // either at req. position or end of the list temp->next = curr->next; curr->next = temp; } } // Here we remove the element with highest priotity // highest priority will be at the head itself void pop(struct Node** head) { struct Node* temp = *head; (*head) = (*head)->next; printf("(%d, priority: %d) popped\n",temp->data,temp->priority); free(temp); } // Function to check is list is empty int isEmpty(struct Node** node) { return (*node) == NULL; } void display(struct Node* node){ printf("Priority Queue: "); // as linked list will end when Node is Null while(node!=NULL) { printf("%d ",node->data); node = node->next; } printf("\n"); } int main() { struct Node* pq = create(10, 1); push(&pq, 30, 3); push(&pq, 20, 2); push(&pq, 40, 4); display(pq); pop(&pq); pop(&pq); display(pq); push(&pq, 15, 2); // if two items have same priority then // they are served in their order of entry push(&pq, 20, 2); push(&pq, 50, 5); push(&pq, 5, 1); display(pq); return 0; }
Output
Priority Queue: 10 20 30 40 (10, priority: 1) popped (20, priority: 2) popped Priority Queue: 30 40 Priority Queue: 5 15 20 30 40 50
Login/Signup to comment