大佬们这个哪里错了,谢谢

#include<stdio.h>
#include<stdlib.h>
#define OVERLOW -2
#define ERROR 0
#define OK 1
typedef int Status;
typedef float QElemType;
typedef struct QLNode{
    QElemType data;
    struct QLNode *next;
}QLNode, *QueuePtr; 
typedef struct {
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;
//创建空队列
Status InitQueue(LinkQueue &Q)
{
    Q.front = Q.rear = (QueuePtr)malloc(sizeof(QLNode));
    if(!Q.front)
    {
        exit(OVERLOW);
     } 
    Q.front = NULL;
    return OK;
}
//销毁队列 
Status DestoryQueue(LinkQueue &Q)
{
    while(Q.front)
    {
        Q.rear = Q.front->next;
        free(Q.rear);
        Q.front = Q.rear;
    }
    return OK;
}
//插入元素e为Q的新的队尾元素 
Status EnQueue(LinkQueue &Q, QElemType e)
{
    QueuePtr p;
    printf("请输入e的值\n");
    scanf("%f", &e);
    p = (QueuePtr)malloc(sizeof(QLNode));
    if(!p)
    {
        exit(OVERLOW);
    }
    p->data = e;
    p->next =NULL;
    Q.rear->next = p;
    Q.rear = p;
    return OK;
}
//删除Q的对头元素,用e带回 
Status DeQueue(LinkQueue &Q, QElemType &e)
{
    QueuePtr p;
    p = (QueuePtr)malloc(sizeof(QLNode));
    if(!p)
    {
        exit(OVERLOW);
    }
    if(Q.front == Q.rear)
    {
        return ERROR;
    }
    p = Q.front->next;
    e = p->data;
    Q.front->next = p->next;
    if (p == Q.rear) //当删除最后一个元素时,尾指针可能没有指向 
    {
        Q.rear = Q.front;
    }
    free(p);
    return OK;
}
//清空队列 
Status ClearQueue(LinkQueue &Q)
{
    QueuePtr p;
    p = (QueuePtr)malloc(sizeof(QLNode));
    if(!p)
    {
        exit(OVERLOW);
    }
    while(!Q.rear)
    {
        p = Q.front->next;
        Q.front->next = p->next;
        free(p);
    }
    Q.rear = Q.front;
    return OK;
 } 
//计算队列的长度 
Status QueueLength(LinkQueue Q)
{
    QueuePtr p;
    p = (QueuePtr)malloc(sizeof(QLNode));
    if(!p)
    {
        exit(OVERLOW);
    }
    Status i = 1;
    p = Q.front->next;
    while(p != Q.rear)
    {
        p = p->next;
        i++;
    }
    return i;
}
//用e返回Q的头部元素 
Status GetHead(LinkQueue Q, QElemType &e)
{
    if(Q.front == Q.rear)
    {
        return ERROR;
    }
    e = Q.front->next->data;
    return OK;
}
//显示队列
Status VisitQueue(LinkQueue Q)
{
    QueuePtr p;
    p = (QueuePtr)malloc(sizeof(QLNode));
    if(!p)
    {
        exit(OVERLOW);
    }
    p = Q.front->next;
    while(p != Q.rear->next)
    {
        printf("%f", p->data);
        p = p->next;
    }
    return 0;
 } 
int main()
{
    LinkQueue Q;
    QElemType e;
    Status flag;
    while(1)
    {
        printf("****************************\n");
        printf("********队列操作系统********\n");
        printf("1.创建空队列                \n");
        printf("2.插入元素e为Q的新的队尾元素\n");
        printf("3.删除Q的对头元素,用e带回  \n");
        printf("4.清空队列                  \n");
        printf("5.计算队列的长度            \n");
        printf("6.用e返回Q的头部元素        \n");
        printf("7.显示队列                  \n");
        printf("8.销毁队列                  \n");
        printf("请选择功能序号:\n");
        scanf("%d", &flag);
        switch(flag)
        {
            case 1: InitQueue(Q);
            break;
            case 2: EnQueue(Q, e);
            break;
            case 3: DeQueue(Q, e);
            break;
            case 4: ClearQueue(Q);
            break;
            case 5: QueueLength(Q);
            break;
            case 6: GetHead(Q, e);
            break;
            case 7: VisitQueue(Q);
            break;
            case 8: DestoryQueue(Q);
            break;
        }//switch
    }//while
    return OK;
}

你的输入是什么, 出现了什么问题? 请提供这些信息。

第三个功能实现不了

你好,我是有问必答小助手。为了技术专家团更好地为您解答问题,烦请您补充下(1)问题背景详情,(2)您想解决的具体问题,(3)问题相关代码图片或者报错信息。便于技术专家团更好地理解问题,并给出解决方案。

您可以点击问题下方的【编辑】,进行补充修改问题。