优先队列(链表实现)

来源:互联网 发布: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;}