为什么出队的时候会异常退出 能不能实现打印队列元素


//顺序存储的队列
#include<stdio.h>
#include<stdlib.h> 
#define ElemType int
#define MaxSize 10 
//定义队列储存类型
typedef struct node{
    ElemType data;
    struct node *next;    
}LinkNode;
typedef struct{
    LinkNode *front,*rear;
}LinkQueue; 


//初始化队列
bool InitQueue(LinkQueue &q){            //传引用更加方便 
    q.front=q.rear = (LinkNode*)malloc(sizeof(struct node));
    q.front=NULL;
    //printf("初始化成功!\n"); 
    return true;
}



//判断队列是否为空
bool QueueEmpty(LinkQueue q){
    if(q.front==q.rear)
    return true;
    return false; 
} 


//入队操作

bool EnterQueue(LinkQueue &q,ElemType x){
    LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
    s->data = x;
    s->next = NULL;
    q.rear->next = s;
    q.rear = s;
    return true;
} 


//出队操作
bool OutQueue(LinkQueue &q,ElemType &j){   //j用来保存出队数据 引用传递 
    if(QueueEmpty(q))
    return false;
    LinkNode *p = q.front->next;
    j = p->data;
    q.front->next = p->next;
    if(q.rear==p)
    q.front=q.rear;
    free(p); 
    return true; 

}  
 
int main(){
    LinkQueue q;
    //LinkNode *t = q.front;
    int j,x;
    int n,N,count1,temp=1;
    int choice;
    bool flag1,flag2,flag3;
    while(temp){
        printf("======队列的顺序存储操作演示=======\n");  
        printf("1. 初始化一个队列\n");  
        printf("2. 进队操作\n");  
        printf("3. 出队操作\n");  
        printf("4. 判断队列是否为空\n");  
        //printf("5. 读取整个队列\n");
        printf("5. 退出顺序表操作演示程序\n");  
        printf("===========================\n");  
        printf("\n输入1-5,选择所需功能号:"); 
        scanf("%d", &choice);  
        printf("\n您选择的功能号为:%d\n", choice);  
  
        switch(choice)  
        {  
            case 1:
                if (InitQueue(q)) 
                    printf("\n队列初始化成功!\n");    
                else 
                    printf("\n队列创建失败!\n");
                system("pause");
                break;
            case 2:
                printf("请输入你要进队个数n(n>=1):\n");
                scanf("%d",&n);
                for(count1 = 0;count1<n;count1++){
                    printf("请输入第%d个数\n",count1+1);
                    scanf("%d",&x);
                    if(flag1=EnterQueue(q,x)){
                        printf("%d成功进队\n",x);
                    }
                    else
                    printf("入队失败!\n");
                }
                system("pause");
                break;
            case 3:
                printf("请输入你要出队的个数N(N>=1):\n");
                scanf("%d",&N);
               for(count1 = 0;count1<N;count1++){
                    if(flag2=OutQueue(q,j)){
                        printf("%d出队成功\n",j);
                    }
                    else if(QueueEmpty(q)) {
                        printf("队空!\n");
                    }
                    else
                    printf("出队失败!\n");
                }
                system("pause");            
                break;
            case 4:
                if(flag3=QueueEmpty(q))
                printf("队空!\n");
                else
                printf("队不空!\n");
                system("pause");
                break;
//            case 5:    
//            //    LinkNode *t = q.front;
//                while(t->next)
//                {
//                   printf("%d ",t->data);
//                   t=t->next;
//                }
//                printf("\n");
//                system("pause");
//                break; 
            case 5:
                printf("欢迎再次使用\n");
                temp = 0;
                break;
        }
    }
    
    return 0;
}

第20行 q.front->next=null