5-26 Windows消息队列

来源:互联网 发布:java 重载的意义 编辑:程序博客网 时间:2024/04/25 15:40

这里写图片描述
这里写图片描述

#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXN 100000#define MAXS 10typedef struct node{    char s[MAXS+1];    int num;}Message;typedef struct Node{    Message *Element;    int size;}*MinHeap;MinHeap Intial(){    MinHeap H;    H=malloc(sizeof(struct Node));    H->Element=malloc(sizeof(Message)*MAXN);    H->size=-1;    return H;}void Insert(MinHeap H,Message item){    int i;    if(H->size==-1)    {        ++H->size;        strcpy(H->Element[H->size].s,item.s);        H->Element[H->size].num=item.num;    }    else    {        ++H->size;        i=H->size;        for(;i>0&&H->Element[(i-1)/2].num>item.num;i=(i-1)/2)        {            strcpy(H->Element[i].s,H->Element[(i-1)/2].s);            H->Element[i].num=H->Element[(i-1)/2].num;        }        strcpy(H->Element[i].s,item.s);        H->Element[i].num=item.num;    }}void Delete(MinHeap H){    int parent,child;    Message temp;    if(-1==H->size)    {        printf("EMPTY QUEUE!\n");        return;    }    printf("%s\n",H->Element[0].s);//输出堆的根节点    strcpy(temp.s,H->Element[H->size].s);    temp.num=H->Element[H->size--].num;    for(parent=0;(parent*2+1)<=H->size;parent=child)    {        child=2*parent+1;        if((child<H->size)&&H->Element[child].num>H->Element[child+1].num)            child++;        if(temp.num<=H->Element[child].num)            break;        else        {            strcpy(H->Element[parent].s,H->Element[child].s);            H->Element[parent].num=H->Element[child].num;        }    }    strcpy(H->Element[parent].s,temp.s);    H->Element[parent].num=temp.num;}int main(){    int N,i;    MinHeap H=Intial();//创建一个空的最小堆    Message X;    char s[4];    scanf("%d",&N);    for(i=0;i<N;i++)    {        scanf("%s",s);        if(strcmp("PUT",s)==0)//如果是PUT则插入        {            scanf("%s %d",X.s,&X.num);            Insert(H,X);        }        else//否则删除最小堆得堆顶元素,然后调整堆,保证删除后仍然是最小堆            Delete(H);    }    return 0;}
0 0
原创粉丝点击