优先队列(链表实现)
来源:互联网 发布:plc显示屏编程 编辑:程序博客网 时间:2024/04/23 15:09
插入时需要按照优先级从高到低排序,一般操作系统的任务队列调度会用到/* 优先队列(链表实现) * front 为队头指针(链表头节点) * rear 为队尾指针 */#include<stdio.h>#include<stdlib.h>typedef struct list_t{int _element;int _priority;struct list_t *_next;}list_t;/* 要改变一个变量的值,需要传入变量的地址作参数; * 要改变一个指针的值,需要传入该指针的地址作参数(即指针的指针); */void insertPriorQueue(list_t **front, list_t **rear, int value, int priority){list_t *prev;list_t *curr;curr = (list_t*)malloc(sizeof(list_t));if(curr == NULL) {printf("error: malloc\n");exit(0);}curr->_element = value;curr->_priority = priority;curr->_next = NULL;if(*rear == NULL) { //empty queue: we need make front = rear = NULL*rear = curr;*front = *rear;} else { /* if node to be inserted has highest priority hence should be the first node */if((*front)->_priority < priority) {curr->_next = *front;*front = curr;}/* if node has the lowest priority hence should be inserted the last node */else if ((*rear)->_priority > priority){(*rear)->_next = curr;*rear = curr;}/* find the proper place to insert */else {prev = *front;while((prev->_next)->_priority >= priority)prev = prev->_next;curr->_next = prev->_next;prev->_next = curr;}}}void delPriorQueue(list_t **front, list_t **rear, int *value){list_t *temp;if((*front == *rear) && (*rear == NULL)) {printf("Queue underflow\n");exit(0);}*value = (*front)->_element;temp = *front;*front = (*front)->_next;if(*rear == temp)*rear = (*rear)->_next;printf("%d(%d)\n", temp->_element, temp->_priority);free(temp);}void printPriorQueue(list_t *head){while(head != NULL) {printf("%d", head->_element);printf("(%d) ", head->_priority);head = head->_next;}putchar('\n');}void item(){ printf("*************** Welcome to the Queue *************\n"); printf("1: Insert one element;\n"); printf("2: Delete one element;\n"); printf("0: Exit.\n"); printf("*************************************************\n"); printf("Select your operation: ");}main(void){char item_choice;list_t *front = NULL;list_t *rear = NULL;int n, priority;item();while(1) { item_choice = getchar(); switch (item_choice) { case '1': printf("Insert a element to the queue: "); scanf("%d %d", &n, &priority); insertPriorQueue(&front, &rear, n, priority); printf("\nQueue: "); printPriorQueue(front); putchar('\n'); item(); break; case '2': printf("Get an element from the queue: "); delPriorQueue(&front, &rear, &n); //printf("Element: %d\n", n); printf("Queue: "); printPriorQueue(front); putchar('\n'); item(); break; case '0': printf("Good luck to you!\n"); return 0; } } return;}