克己ovo 2021-09-21 18:29 采纳率: 90%
浏览 14
已结题

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


//顺序存储的队列
#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;
}
  • 写回答

1条回答 默认 最新

  • 克己ovo 2021-09-21 19:00
    关注

    第20行 q.front->next=null

    评论

报告相同问题?

问题事件

  • 系统已结题 9月29日
  • 创建了问题 9月21日

悬赏问题

  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误