2301_79683887 2023-09-23 00:05 采纳率: 70.6%
浏览 4
已结题

段错误,看不出来哪错了?怎么改啊?

多项式加法与乘法

#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)
            //t1大t2插入,因为降序排列,t2后面已经没有比此时ti数值大的了
            //即没有可以合并的项,直接插到尾部
            //t1移向下一个元素
        {
                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;
        }
    //先让t1的每一项乘以t2的每一项创建链表
        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;
    //t1的其他项乘以t2的所有项并将每一个乘出来的项插入刚刚创建的链表中
        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 ;
 
}
 

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-09-23 00:09
    关注

    引用 皆我百晓生 小程序回复内容作答:
    这段代码可能会导致段错误的原因是在mul函数中,t3节点没有正确初始化。在t3节点插入链表之前,你需要分配内存空间并将pNext设置为空。

    你可以修改mul函数的代码如下:

    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;
            t3->pNext = NULL;  // 添加这一行代码
            pTail->pNext = t3;
            pTail = t3;
            t2 = t2->pNext;
        }
        t1 = t1->pNext;
        
        while (t1){
            t2 = p2->pNext;
            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;
                }
                if (p->pNext && p->pNext->data2 == e){
                    if (p->pNext->data1 + c){
                        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;
    }
    

    请注意,在修改后的代码中,我们始终为t3节点分配了内存,并将pNext设置为NULL。这样就能够正确操作链表节点,从而避免段错误。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月6日
  • 已采纳回答 11月28日
  • 创建了问题 9月23日