Zapapa 2020-04-11 13:29 采纳率: 0%
浏览 123

内存超限pat 一元多项式的乘法与加法运算

pat上显示内存超限 有部分答案正确 在vc++2010上编译通过 但不能正确输出
求大佬指出错误

#include<stdio.h>
#include<stdlib.h>

typedef struct PolyNode* polynomial;
struct PolyNode{
    int coef;
    int expon;
    polynomial next;
};

void attach(int c,int e,polynomial* prear)
{
    polynomial p;
    p=(polynomial)malloc(sizeof(struct PolyNode));
    p->coef=c;
p->expon=e;
p->next=NULL;
    (*prear)->next=p;
    *prear=p;
}

polynomial readpoly()
{
    polynomial p,rear,t;
    int c,e,n;

    scanf("%d",&n);
    p=(polynomial)malloc(sizeof(struct PolyNode));
    p->next=NULL;
    rear=p;

    while(n--){
        scanf("%d %d",&c,&e);
        attach(c,e,&rear);
    }
    t=p;p=p->next;free(t);
    return p;
}

polynomial multipoly(polynomial p1,polynomial p2)
{
    polynomial p,rear,t1,t2,t;
    int c,e;
    if(!p1||!p2) return NULL;
    t1=p1;t2=p2;

    p=(polynomial)malloc(sizeof(struct PolyNode));
    p->next=NULL;
    rear=p;

    while(t2){
        attach(t1->coef*t2->coef,t1->expon+t2->expon,&rear);
        t2=t2->next;
    }
    t1=t1->next;

    while(t1){
        t2=p;rear=p;
        while(t2){
            c=t1->coef*t2->coef;
            e=t1->expon+t2->expon;
            while(rear->next&&rear->next->expon>e) rear=rear->next;
            if(rear->next&&rear->next->expon==e){
                if(rear->next->coef+c){
                rear->next->coef+=c;
                }
                else{
                    t=rear->next;
                    rear->next=t->next;
                    free(t);
                }
            }
            else{
                t=(polynomial)malloc(sizeof(struct PolyNode));
                t->coef=c;
                t->expon=e;
                t->next=rear->next;
                rear->next=t;
                rear=rear->next;
            }
            t2=t2->next;
        }
        t1=t1->next;
    }
    t=p;p=p->next;free(t);
    return p;

}

int compare(int a,int b)
{
   if(a>b) return 1;
   if(a<b) return -1;
   if(a==b)  return 0;
}

polynomial addpoly(polynomial P1,polynomial P2) {
    polynomial P, Rear, t1, t2, t;
    int c, e;
    if (!P1 && !P2) return NULL; 
    t1 = P1; 
    t2 = P2;
    P = (polynomial)malloc(sizeof(struct PolyNode)); P->next = NULL;
    Rear = P;

    while (t1 !=NULL && t2 != NULL) {

        if (t1->expon < t2->expon)
        {
            Rear->next = t2;
            t2 = t2->next;
            Rear = Rear->next;
        }
        else if (t2->expon < t1->expon) {
            Rear->next = t1;
            t1 = t1->next;
            Rear = Rear->next;
        }
        else 
        {
            t2->coef += t1->coef;
            if (t2->coef != 0) 
            {
                Rear->next = t2;
                t2 = t2->next;
                Rear = Rear->next;
            }
            else {
                t = t2;
                t2 = t2->next;
                free(t);
            }
            t = t1;
            t1 = t1->next;
            free(t); 
        }

    }

    if (t1 == NULL) {
        Rear->next = t2;
    }
    else if(t2 == NULL){
        Rear->next = t1;
    }

    t2 = P; P = P->next; free(t2);
    return P;

}


void printpoly(polynomial p)
{
    int flag=0;
    if(!p){
        printf("0 0\n");
        return; 
    }

    while(p){
        if(!flag) flag=1;
        else printf(" ");
        printf("%d %d",p->coef,p->expon);
        p=p->next;
    }
    printf("\n");
}

int main()
    {
      polynomial p1,p2,pp,ps; 
        p1=readpoly();
        p2=readpoly();
        pp=multipoly(p1,p2);
        printpoly(pp);
        ps=addpoly(p1,p2);
        printpoly(ps);
        return 0;
    }

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 Java领域优质创作者 2024-07-25 15:50
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题分析:
    1. 内存超限:可能是由于每次计算完结果都没有释放内存造成了内存泄露
    2. 部分答案正确:可能是由于在进行多项式相加时出现了错误
    3. 不能正确输出:可能是由于在输出结果时没有按照规定的格式输出 解决方法:
    4. 在每次计算完结果后,应该释放掉不再使用的内存块,避免内存泄露
    5. 在多项式相加的逻辑中,需要注意判断条件的顺序,确保每一步计算均正确
    6. 在输出结果时,按照题目要求的格式输出,并注意每个数字之间的空格或换行符 代码示例修改:
    polynomial addpoly(polynomial P1, polynomial P2) {
        // 省略部分代码
        while (t1 != NULL && t2 != NULL) {
            if (t1->expon < t2->expon) { 
                // 省略部分代码
            } else if (t2->expon < t1->expon) {
                // 省略部分代码
            } else {
                t2->coef += t1->coef;
                if (t2->coef == 0) {
                    t = t2;
                    t2 = t2->next;
                    free(t);
                } else {
                    // 省略部分代码
                }
                t = t1;
                t1 = t1->next;
                free(t); // 添加释放内存的操作
            }
        }
        // 省略部分代码
    }
    

    这样对于内存的释放,可以避免内存泄漏问题。另外,确保在对结果进行输出时,按照正确的格式输出。

    评论

报告相同问题?