链队入队操作报内存错误

图片说明

#include <iostream>
using namespace std;
typedef struct queuenode{
    int  data;
    struct queuenode *next;
}QueueNode;
typedef struct{
    QueueNode  *front;
    QueueNode  *rear;
}LinkQueue;
void InitQueue(LinkQueue  *Q)
{
    Q = (LinkQueue *)malloc(sizeof(LinkQueue));
    Q->front = Q->rear = (queuenode *)malloc(sizeof(queuenode));
    Q->front->next = Q->rear->next = NULL;
}
int Empty(LinkQueue  *Q)
{
    return (Q->front->next == NULL && Q->rear->next == NULL);
}
void EnQueue(LinkQueue  *Q, int x)
{
    QueueNode *p;
    p = (QueueNode *)malloc(sizeof(QueueNode));
    p->data = x;
    p->next = NULL;
    Q->rear->next = p;
    Q->rear = p;
}
int DeQueue(LinkQueue *Q)
{
    QueueNode  *p;
    int x;
    if (Empty(Q))
        return 0;
    p = Q->front->next;
    Q->front->next = p->next;
    if (p->next == NULL)
        Q->rear = Q->front;
    x = p->data;
    free(p);
    return x;
}
void main()
{
    LinkQueue *lq = NULL;
    InitQueue(lq);
    EnQueue(lq, 5);
    int num;
    num = DeQueue(lq);
}

void InitQueue(LinkQueue **Q)
{
*Q = (LinkQueue *)malloc(sizeof(LinkQueue));
(*Q)->front = Q->rear = (queuenode *)malloc(sizeof(queuenode));
(*Q)->front->next = Q->rear->next = NULL;
}

LinkQueue *lq = NULL;
InitQueue(&lq);