两个队列实现一个栈 下面代码是入栈的实现,编译通过,但是运行异常

两个队列实现一个栈 下面代码是入栈的实现,编译通过,但是运行错误
#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
int data;
struct Node *next;
}Node;

typedef struct 
{
Node *front, *rear;
}Linkqueue;

void Enqueue(Linkqueue **q, int element)
{
Node *pnode = (Node *)malloc(sizeof(Node));
pnode->data = element;
pnode->next = NULL;

(*q)->rear->next = pnode;
(*q)->rear = pnode;

printf("%d\n", (*q)->rear->data);
}

void push_queue(Linkqueue **q1, Linkqueue **q2, int element)
{
if((*q1)->front != (*q1)->rear)
Enqueue(q1, element);
else
Enqueue(q2, element);
}

int main(int argc, char *argv[])
{
Linkqueue *q1 = NULL;
Linkqueue *q2 = NULL;

push_queue(&q1, &q2, 5);

return 0;
}

------解决思路----------------------
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

------解决思路----------------------
void push_queue(Linkqueue **q1, Linkqueue **q2, int element)
{
    if((*q1)->front != (*q1)->rear)
        Enqueue(q1, element);
    else
        Enqueue(q2, element);
}
 
int main(int argc, char *argv[])
{
    Linkqueue *q1 = NULL;
    Linkqueue *q2 = NULL;
         
    push_queue(&q1, &q2, 5);
     
    return 0;
}

这句会崩吧?空指针怎么可能有数据??
------解决思路----------------------
void push_queue(Linkqueue **q1, Linkqueue **q2, int element)
{
    if((*q1)->front != (*q1)->rear)
        Enqueue(q1, element);
    else
        Enqueue(q2, element);
}
 
int main(int argc, char *argv[])
{
    Linkqueue *q1 = NULL;
    Linkqueue *q2 = NULL;
         
    push_queue(&q1, &q2, 5);
     
    return 0;
}

木有变红呢?这句会崩吧?空指针怎么可能有数据??