优先队列的链表实现

插入时需要按照优先级从高到低排序,一般操作系统的任务队列调度会用到  

/* 优先队列(链表实现) 
 * 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;  
}  

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值