多项式加法与乘法pta段错误怎么办

img


#include <stdio.h>
#include <stdlib.h>
typedef struct node {
    int data1;
    int data2;
    struct node *pNext;
} NODE,*PNODE;
PNODE create();
PNODE add(PNODE p1,PNODE p2);
PNODE mul(PNODE p1,PNODE p2);
void tra(PNODE pp);
int main()
{   PNODE p1=NULL;
    p1=create();
     PNODE p2=NULL;
    p2=create();
   PNODE p=NULL;
  p=mul(p1,p2);
   tra(p);
   printf("\n");
    PNODE pp=NULL;
   pp=add(p1,p2);
   tra(pp);

    return 0;
}

PNODE create(){
 int i;
    int n=0;
    int val=0;
    int val2=0;
        PNODE pHead = (PNODE)malloc(sizeof(NODE));
        PNODE pTail=pHead;
        pTail->pNext=NULL;

            //printf("输入此时链表长度\n");
           scanf("%d",&n);
        for(i=0;i<n;i++)//输入数据
            {
                scanf("%d %d",&val,&val2);

              PNODE pNew = (PNODE)malloc(sizeof(NODE));
              pNew->data1=val;
              pNew->data2=val2;
              pTail->pNext=pNew;
              pNew->pNext=NULL;
              pTail=pNew;}


        return pHead;

}
//加法
PNODE add(PNODE p1,PNODE p2){
      PNODE pHead = (PNODE)malloc(sizeof(NODE));
        PNODE pTail=pHead;
        pTail->pNext=NULL;
        PNODE t1=p1->pNext;
        PNODE t2=p2->pNext;
        PNODE t3 =NULL;
        while(t1&&t2){
             t3 = (PNODE)malloc(sizeof(NODE));
        if(t1->data2==t2->data2){
           int sum=t1->data1+t2->data1;
           if(sum!=0){
                 t3->data2=t1->data2;
           t3->data1=sum;
            pTail->pNext=t3;
            t3->pNext=NULL;
            pTail=t3;}
            t1=t1->pNext;
            t2=t2->pNext;
        }
        else if(t1->data2>t2->data2){
                t3->data1=t1->data1;
                t3->data2=t1->data2;
                pTail->pNext=t3;
            t3->pNext=NULL;
            pTail=t3;
            t1=t1->pNext;
        }
        else if(t1->data2<t2->data2){
           t3->data1=t2->data1;
                t3->data2=t2->data2;
                pTail->pNext=t3;
            t3->pNext=NULL;
            pTail=t3;
            t2=t2->pNext;
        }

        }
        if(t2!=NULL){
            while(t2){
               t3 = (PNODE)malloc(sizeof(NODE));
            t3->data1=t2->data1;
                t3->data2=t2->data2;
                pTail->pNext=t3;
            t3->pNext=NULL;
            pTail=t3;
            t2=t2->pNext;
            }
        }
        if(t1!=NULL){
            while(t1){
                t3 = (PNODE)malloc(sizeof(NODE));
                t3->data1=t1->data1;
                t3->data2=t1->data2;
                pTail->pNext=t3;
            t3->pNext=NULL;
            pTail=t3;
            t1=t1->pNext;
            }
        }


       return pHead;

}

//乘法
PNODE mul(PNODE p1,PNODE p2){
   PNODE pHead = (PNODE)malloc(sizeof(NODE));
        PNODE pTail=pHead;
        pTail->pNext=NULL;
        PNODE t1=p1->pNext;
        PNODE t2=p2->pNext;
        PNODE t3 =NULL;
        int c=0,e=0;
        if(t1==NULL||t2==NULL){
            return NULL;
        }
        while(t2){
                 t3 = (PNODE)malloc(sizeof(NODE));
                 t3->data2=t1->data2+t2->data2;
           t3->data1=t1->data1*t2->data1;
           pTail->pNext=t3;
            t3->pNext=NULL;
            pTail=t3;
            t2=t2->pNext;
        }
        t1=t1->pNext;
        while(t1){
                t2=p2->pNext;//t2重新初始化
                PNODE p=pHead;
        while(t2){
             c=t1->data1*t2->data1;
             e=t1->data2+t2->data2;
             while(p->pNext&&p->pNext->data2>e)//要求降序排列
                {
                    p=p->pNext;}//p成为要插入位置前的一位,即插到p后面

                    if(p->pNext&&p->pNext->data2==e)//不需要申请新节点直接合并
                        {
                if(p->pNext->data1+c){
                    p->pNext->data1=p->pNext->data1+c;
                }
                else{
                    PNODE t=p->pNext;
                    p->pNext=p->pNext->pNext;
                    free(t);
                }
             }
             else{
                PNODE tt= (PNODE)malloc(sizeof(NODE));//新的指数,需要创建新节点
                tt->data1=c;
                tt->data2=e;
              tt->pNext=p->pNext;
              p->pNext=tt;
                 p=p->pNext;
             }
             t2=t2->pNext;

        }

        t1=t1->pNext;
        }

     return pHead;
}
//遍历
void tra(PNODE pp){
   PNODE p=pp->pNext;
   if(p==NULL){
    printf("0 0\n");
   }
   while(p->pNext!=NULL){
    printf("%d %d ",p->data1,p->data2);
    p=p->pNext;
   }
     printf("%d %d",p->data1,p->data2);
   return ;

}


pta有两个测试点提示段错误怎么修改?

【以下回答由 GPT 生成】

在你的代码中,出现段错误的原因是因为在多项式相加的函数add中有一个死循环。这个问题是由于你没有在循环中对t1t2进行更新导致的,所以它们的值不会改变,循环无法退出。

要解决这个问题,你需要在循环中为t1t2指针更新到下一个节点。在多项式相加的循环内部添加如下代码:

t1 = t1->pNext;
t2 = t2->pNext;

此外,你也需要为t1t2添加结束循环的条件。在节点相加的while循环开始部分添加如下代码:

while (t1 && t2)

这样当t1t2为空指针时,循环就会退出。

修改后的add函数代码如下:

PNODE add(PNODE p1, PNODE p2)
{
    PNODE pHead = (PNODE)malloc(sizeof(NODE));
    PNODE pTail = pHead;
    pTail->pNext = NULL;
    PNODE t1 = p1->pNext;
    PNODE t2 = p2->pNext;
    PNODE t3 = NULL;

    while (t1 && t2)
    {
        t3 = (PNODE)malloc(sizeof(NODE));
        if (t1->data2 == t2->data2)
        {
            int sum = t1->data1 + t2->data1;
            if (sum != 0)
            {
                t3->data2 = t1->data2;
                t3->data1 = sum;
                pTail->pNext = t3;
                t3->pNext = NULL;
                pTail = t3;
            }
        }
        t1 = t1->pNext;
        t2 = t2->pNext;
    }

    return pHead;
}

在上述代码中,我添加了对t1t2的更新,并在循环开始时添加了结束循环的条件。

此外,还有一个问题是在mul函数中没有实现多项式的乘法运算。你可以尝试在mul函数中根据多项式的乘法规则来编写代码。

综上所述,修改后的代码应该解决了段错误的问题,但仍然需要补充mul函数来完整实现多项式的乘法运算。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^