是编程小白啊 2023-03-17 19:55 采纳率: 15.4%
浏览 70
已结题

关于#c语言#的问题:主函数部分的错误不会改,任意输入n个100以内的数,将它们的奇数和偶数分别存入链队为Q1和Q2中,然后配对输出链队Q1、Q2中的值

主函数部分的错误不会改,求帮忙
题目如下

编写一个程序,任意输入n个100以内的数,将它们的奇数和偶数分别存入链队为Q1和Q2中,然后配对输出链队Q1、Q2中的值,直到任一队列为空为止。

#include<stdio.h>
#include<stdlib.h>
# define OK 1
# define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int QElemType;
typedef struct QNode{
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue &Q){
    //构造新的队列 
    Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
    if(!Q.front) exit(OVERFLOW);
    Q.front->next=NULL;
    return OK;
}
Status EnQueue(LinkQueue &Q, QElemType e){
    //插入元素e为Q的新的队尾元素
    QueuePtr p;
    p=(QueuePtr)malloc(sizeof(QNode));
    if(!p) exit(OVERFLOW);
    p->next=NULL;
    p->data=e;
    Q.rear->next=p;
    Q.rear=p;
    return OK; 
}
Status DeQueue(LinkQueue &Q,QElemType &e){
    //若队不空,删除Q的队头元素,并用e返回其值
    QueuePtr p;
    if(Q.front==Q.rear) return ERROR;
     p=(QueuePtr)malloc(sizeof(QNode));
    if(!p) exit(OVERFLOW);
    p=Q.front->next;
    e=p->data;
    Q.front->next=p->next;
    if(Q.rear==p) Q.rear=Q.front;
    free(p);
    return OK;
}
int main(){
    struct  Q1,Q2;
    InitQueue(&Q1);
    InitQueue(&Q2);
    int cou,cou1,cou2;
    scanf("%d",&cou);
    int a,i,j;
    for(i=0;i<cou;i++){
        scanf("%d",&a[i]);
        if(a[i]%2==0){
        EnQueue(&Q1,a[i]);
        cou1++;}
        else{
        EnQueue(&Q2,a[i]);
        cou2++;
        }    
    }
    int min,n1,n2;
    min=(cou1<=cou2)?cou1:cou2;
    for(j=0;j<min;j++){
    DeQueue(&Q1,&n1);
    DeQueue(&Q1,&n2);
    printf("%d %d\n",n1,n2);
    }
    return 0;
}

  • 写回答

3条回答 默认 最新

  • lshen01 2023-03-17 20:15
    关注

    参考GPT和自己的思路:

    根据题目要求,需要将输入的数按照奇偶性放入两个队列中,然后进行配对输出。对于给出的代码,有以下几处问题:

    1. 在 main 函数中定义了 Q1Q2,但是定义方式不正确,应该改为:
    LinkQueue Q1, Q2;
    
    1. 在使用 InitQueue 函数初始化队列时,应该传入队列的地址而不是队列本身,因此调用应该改为:
    InitQueue(&Q1);
    InitQueue(&Q2);
    
    1. 在输入数据时,应该将输入的第 i 个数存入变量 a 中而不是数组 a 中的第 i 个元素,因此应该将:
    scanf("%d", &a[i]);
    

    改为:

    scanf("%d", &a);
    
    1. 在将奇数存入 Q2 中时,变量 cou2 没有进行初始化,应该改为:
    int cou, cou1 = 0, cou2 = 0;
    
    1. 在将偶数存入 Q1 中时,应该将变量 cou1++ 改为 cou2++,因为偶数应该存入 Q2 中,而不是 Q1 中。

    2. 在输出配对值时,应该将 DeQueue 函数的第一个参数改为 &Q2,因为偶数存入了 Q2 中。

    修改后的代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -2
    
    typedef int Status;
    typedef int QElemType;
    
    typedef struct QNode{
        QElemType data;
        struct QNode *next;
    } QNode, *QueuePtr;
    
    typedef struct{
        QueuePtr front;
        QueuePtr rear;
    } LinkQueue;
    
    Status InitQueue(LinkQueue *Q){
        //构造新的队列 
        Q->front = Q->rear = (QueuePtr) malloc(sizeof(QNode));
        if(!Q->front) 
            exit(OVERFLOW);
        Q->front->next = NULL;
        return OK;
    }
    
    Status EnQueue(LinkQueue *Q, QElemType e){
        //插入元素e为Q的新的队尾元素
        QueuePtr p;
        p = (QueuePtr) malloc(sizeof(QNode));
        if(!p) 
            exit(OVERFLOW);
        p->next = NULL;
        p->data = e;
        Q->rear->next = p;
        Q->rear = p;
        return OK; 
    }
    
    Status DeQueue(LinkQueue *Q, QElemType *e){
        //若队不空,删除Q的队头元素,并用e返回其值
        QueuePtr p;
        if(Q->front==Q->rear) 
            return ERROR;
        p = Q->front->next;
        *e = p->data;
        Q->front->next = p->next;
        if(Q->rear==p) 
            Q->rear = Q->front;
        free(p);
        return OK;
    }
    
    int main(){
        LinkQueue Q1, Q2;
        InitQueue(&Q1);
        InitQueue(&Q2);
        int cou, cou1 = 0, cou2 = 0;
        scanf("%d",&cou);
        int a,i,j;
        for(i = 0; i < cou; i++){
            scanf("%d", &a);
            if(a % 2 == 0){
                EnQueue(&Q2, a);
                cou2++;
            } else {
                EnQueue(&Q1, a);
                cou1++;
            }    
        }
        int min, n1, n2;
        min = (cou1 <= cou2) ? cou1 : cou2;
        for(j = 0; j < min; j++){
            DeQueue(&Q1, &n1);
            DeQueue(&Q2, &n2);
            printf("%d %d\n", n1, n2);
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月25日
  • 已采纳回答 3月17日
  • 创建了问题 3月17日

悬赏问题

  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图