1. 程式人生 > >Windows訊息佇列 (c語言)

Windows訊息佇列 (c語言)

題目描述

訊息佇列是Windows系統的基礎。對於每個程序,系統維護一個訊息佇列。如果在程序中有特定事件發生,如點選滑鼠、文字改變等,系統將把這個訊息加到隊列當中。同時,如果佇列不是空的,這一程序迴圈地從佇列中按照優先順序獲取訊息。請注意優先順序值低意味著優先順序高。請編輯程式模擬訊息佇列,將訊息加到佇列中以及從佇列中獲取訊息。

輸入描述

輸入首先給出正整數N(≤10^5),隨後N行,每行給出一個指令——GET或PUT,分別表示從佇列中取出訊息或將訊息新增到佇列中。如果指令是PUT,後面就有一個訊息名稱、以及一個正整數表示訊息的優先順序,此數越小表示優先順序越高。訊息名稱是長度不超過10個字元且不含空格的字串;題目保證佇列中訊息的優先順序無重複,且輸入至少有一個GET。

輸出描述

對於每個GET指令,在一行中輸出訊息佇列中優先順序最高的訊息的名稱和引數。如果訊息佇列中沒有訊息,輸出EMPTY QUEUE!。對於PUT指令則沒有輸出。

輸入樣例 9 PUT msg1 5 PUT msg2 4 GET PUT msg3 2 PUT msg4 4 GET GET GET GET

輸出樣例 msg2 msg3 msg4 msg1 EMPTY QUEUE!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct node* List;
struct node
{
    int data;
    char a[15];
    struct node *next;
};

List Insert(List head, char b[], int x)
{

    List r, q;
    List p = (List)malloc(sizeof(struct node));
    strcpy(p->a, b);
    p->data = x;
    r = head;
    if(head->next == NULL)
    {
        r->next = p;
        p->next = NULL;
    }
    else
    {
        q = r;
        r = r->next;
        while(r->next != NULL && r->data > x)
        {
                q = r;
                r = r->next;
        }
        if(r->data < x)
        {
            if(r->next == NULL)
            {
                r->next = p;
                p->next = NULL;
            }
            else
            {
                q = r;
                r = r->next;
                p->next = r;
                q->next = p;

            }
        }
        else
        {
            p->next = r;
            q->next = p;

        }

    }
    return head;
}

List Delete(List head)
{
     List ptr;
     ptr = head;
    if(head->next == NULL)
    {
        printf("EMPTY QUEUE!\n");
        return head;
    }
    head = head->next;
    free(ptr);
    printf("%s\n", head->a);
    return head;
}

int main()
{
    List head;
    head = (List)malloc(sizeof(struct node));
    head->next = NULL;
    int n,x;
    char s[5];
    char b[15];
    scanf("%d", &n);
        int i;
        for(i = 0; i < n; i++)
        {
            scanf("%s", s);
            if(strcmp(s, "PUT") == 0)
            {
                scanf("%s %d", b, &x);

                head = Insert(head, b, x);
            }
            else
            {
                head = Delete(head);
            }
        }

    return 0;
}