Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

คิวลำดับความสำคัญโดยใช้รายการที่เชื่อมโยงในC


เราได้รับข้อมูลและลำดับความสำคัญเป็นค่าจำนวนเต็ม และภารกิจคือการสร้างรายการที่เชื่อมโยงตามลำดับความสำคัญที่กำหนดและแสดงผล

คิวเป็นโครงสร้างข้อมูล FIFO โดยองค์ประกอบที่แทรกก่อนเป็นองค์ประกอบแรกที่จะถูกลบออก คิวลำดับความสำคัญเป็นประเภทของคิวที่สามารถแทรกหรือลบองค์ประกอบขึ้นอยู่กับลำดับความสำคัญ สามารถใช้งานได้โดยใช้โครงสร้างข้อมูลคิว สแต็ก หรือรายการลิงก์ คิวลำดับความสำคัญจะดำเนินการตามกฎเหล่านี้ -

  • ข้อมูลหรือองค์ประกอบที่มีลำดับความสำคัญสูงสุดจะถูกดำเนินการก่อนข้อมูลหรือองค์ประกอบที่มีลำดับความสำคัญต่ำสุด
  • หากองค์ประกอบสองรายการมีลำดับความสำคัญเท่ากันกว่าองค์ประกอบนั้นจะถูกดำเนินการตามลำดับ องค์ประกอบนั้นจะถูกเพิ่มในรายการ

โหนดของรายการที่เชื่อมโยงสำหรับการนำคิวลำดับความสำคัญไปใช้จะมีสามส่วน -

  • ข้อมูล − จะเก็บค่าจำนวนเต็ม
  • ที่อยู่ − มันจะเก็บที่อยู่ของโหนดถัดไป
  • ลำดับความสำคัญ −มันจะเก็บลำดับความสำคัญซึ่งเป็นค่าจำนวนเต็ม สามารถอยู่ในช่วงตั้งแต่ 0-10 โดยที่ 0 หมายถึงลำดับความสำคัญสูงสุด และ 10 หมายถึงลำดับความสำคัญต่ำสุด

ตัวอย่าง

ป้อนข้อมูล

คิวลำดับความสำคัญโดยใช้รายการที่เชื่อมโยงในC

ผลผลิต

คิวลำดับความสำคัญโดยใช้รายการที่เชื่อมโยงในC

อัลกอริทึม

Start
Step 1-> Declare a struct node
   Declare data, priority
   Declare a struct node* next
Step 2-> In function Node* newNode(int d, int p)
   Set Node* temp = (Node*)malloc(sizeof(Node))
   Set temp->data = d
   Set temp->priority = p
   Set temp->next = NULL
   Return temp
Step 3-> In function int peek(Node** head)
   return (*head)->data
Step 4-> In function void pop(Node** head)
   Set Node* temp = *head
   Set (*head) = (*head)->next
   free(temp)
Step 5-> In function push(Node** head, int d, int p)
   Set Node* start = (*head)
   Set Node* temp = newNode(d, p)
   If (*head)->priority > p then,
      Set temp->next = *head
      Set (*head) = temp
   Else
   Loop While start->next != NULL && start->next->priority < p
      Set start = start->next
      Set temp->next = start->next
      Set start->next = temp
Step 6-> In function int isEmpty(Node** head)
   Return (*head) == NULL
Step 7-> In function int main()
   Set Node* pq = newNode(7, 1)
   Call function push(&pq, 1, 2)
   Call function push(&pq, 3, 3)
   Call function push(&pq, 2, 0)
   Loop While (!isEmpty(&pq))
   Print the results obtained from peek(&pq)
   Call function pop(&pq)
Stop

ตัวอย่าง

#include <stdio.h>
#include <stdlib.h>
// priority Node
typedef struct node {
   int data;
   int priority;
   struct node* next;
} Node;
Node* newNode(int d, int p) {
   Node* temp = (Node*)malloc(sizeof(Node));
   temp->data = d;
   temp->priority = p;
   temp->next = NULL;
   return temp;
}
int peek(Node** head) {
   return (*head)->data;
}
void pop(Node** head) {
   Node* temp = *head;
   (*head) = (*head)->next;
   free(temp);
}
void push(Node** head, int d, int p) {
   Node* start = (*head);
   Node* temp = newNode(d, p);
   if ((*head)->priority > p) {
      temp->next = *head;
      (*head) = temp;
   } else {
      while (start->next != NULL &&
      start->next->priority < p) {
         start = start->next;
      }
      // Either at the ends of the list
      // or at required position
      temp->next = start->next;
      start->next = temp;
   }
}
// Function to check the queue is empty
int isEmpty(Node** head) {
   return (*head) == NULL;
}
// main function
int main() {
   Node* pq = newNode(7, 1);
   push(&pq, 1, 2);
   push(&pq, 3, 3);
   push(&pq, 2, 0);
   while (!isEmpty(&pq)) {
      printf("%d ", peek(&pq));
      pop(&pq);
   }
   return 0;
}

ผลลัพธ์

2 7 1 3