m0_74128289 2023-01-27 18:16 采纳率: 87.5%
浏览 29
已结题

链表实现一元函数相加

链表相加函数出什么错了,代码一执行到那就结束了,不能输出最后相加的结果;
相加函数流程图:

img


正确的样例:

img

有问题的代码

#include<stdio.h>
#include<stdlib.h>
typedef struct PNODE
{
    float coef;
    int expn;
    struct PNODE*next;
}PNODE;
PNODE *insert(PNODE *head,PNODE *s);
PNODE *creatPoly(PNODE *head);
void  shuchu(PNODE *head);
PNODE *addPoly(PNODE *headA,PNODE *headB);
int main()
{
    PNODE *headA,*headB;
    headA=creatPoly(headA);
    printf("\n输出多项式A:\n");
    shuchu(headA);
    headB=creatPoly(headB);
    printf("\n输出多项式B:\n");
    shuchu(headB);
    headA=addPoly(headA,headB);
    printf("\n输出两个多项式相加后的结果多项式:\n");
    shuchu(headA);
    return 0;
}
PNODE *creatPoly(PNODE *head)
{
    int n,i;
    head=NULL;
    PNODE *s;
    printf("输入该多项式的项数:");
    scanf("%d",&n);
    printf("\n输入多项式各项系数以及指数:");
    for(i=1;i<=n;i++)
    {
        s=(PNODE*)malloc(sizeof(PNODE));
        s->next = NULL;
        scanf("%f %d",&s->coef,&s->expn);
        if(i!=1)
        {
            head=insert(head,s);
        }
        else
        {
            head=s;
            head->next=NULL;
        }
    }
    printf("输入完成\n");
    return head;
}
PNODE *insert(PNODE *head,PNODE *s)
{
    PNODE *p,*pr;
    p=pr=head;
    while(p->next && p->next->expn < s->expn)
    {
        p=p->next;
    }
    if (p == head && p->expn > s->expn){
        s->next = head;
        head = s;
    }
    else{
        s->next = p->next;
        p->next = s;
    }
    return head;
}
void shuchu(PNODE *head)
{
    PNODE *p;
    p=head;
    while(p!=NULL)
    {
        printf("\t%f %d,",p->coef,p->expn);
        p=p->next;
    }
    printf("\n");
}
PNODE *addPoly(PNODE *headA,PNODE *headB)
{
    PNODE *p1,*p2,*p3,*r; float sum=0;
    p1=headA,p2=headB;
    headA=NULL,p3=NULL;
    if(p1&&p2)
    {
        if(p1->expn==p2->expn)
        {
            sum=p1->coef+p2->coef;
            if(sum==0)
            {
               r=p1;
               p1=p1->next;
               free(r);
               r=p2;
               p2=p2->next;
               free(r);
            }
            else{
                p1->coef=sum;
                p3->next=p1;
                p3=p1;
                p1=p1=p1->next;
                r=p2;
                p2=p2->next;
                free(r);
            }
        }
        else{
           if(p1->expn<p2->expn){
               if(p3!=NULL){
                   p3->next=p1;
                   p3=p1;
                   p1=p1->next;
               }
               else{
                   p3=p1;
                   p1=p1->next;
                   p3->next=NULL;
               }
           }
           else{
               if(p3!=NULL){
                   p3->next=p2;
                   p3=p2;
                   p2=p2->next;
            }
            else{
                p3=p2;
                p2=p2->next;
                p3->next=NULL;
            }
           }

        }
    }
    else{
        if(p1!=NULL){
            p3->next=p1;
        }
        else{
            p3->next=p2;
        }
    }
    return p3;
}


  • 写回答

2条回答 默认 最新

  • qzjhjxj 2023-01-27 20:07
    关注

    修改如下,改动处见注释,供参考:

    #include<stdio.h>
    #include<stdlib.h>
    typedef struct PNODE
    {
        float coef;
        int expn;
        struct PNODE*next;
    }PNODE;
    PNODE *insert(PNODE *head,PNODE *s);
    PNODE *creatPoly(PNODE *head);
    void  shuchu(PNODE *head);
    PNODE *addPoly(PNODE *headA,PNODE *headB);
    int main()
    {
        PNODE *headA,*headB;
        headA=creatPoly(headA);
        printf("\n输出多项式A:\n");
        shuchu(headA);
        headB=creatPoly(headB);
        printf("\n输出多项式B:\n");
        shuchu(headB);
        headA=addPoly(headA,headB);
        printf("\n输出两个多项式相加后的结果多项式:\n");
        shuchu(headA);
        
        return 0;
    }
    PNODE *creatPoly(PNODE *head)
    {
        int n,i;
        head=NULL;
        PNODE *s;
        printf("输入该多项式的项数:");
        scanf("%d",&n);
        printf("\n输入多项式各项系数以及指数:");
        for(i=1;i<=n;i++)
        {
            s=(PNODE*)malloc(sizeof(PNODE));
            s->next = NULL;
            scanf("%f %d",&s->coef,&s->expn);
            if(i!=1)
            {
                head=insert(head,s);
            }
            else
            {
                head=s;
                head->next=NULL;
            }
        }
        printf("输入完成\n");
        return head;
    }
    PNODE *insert(PNODE *head,PNODE *s)
    {
        PNODE *p,*pr;
        p=pr=head;
        while(p->next && p->next->expn < s->expn)
        {
            p=p->next;
        }
        if (p == head && p->expn > s->expn){
            s->next = head;
            head = s;
        }
        else{
            s->next = p->next;
            p->next = s;
        }
        return head;
    }
    void shuchu(PNODE *head)
    {
        PNODE *p;
        p=head;
        while(p!=NULL)
        {
            printf("\t%f %d,",p->coef,p->expn);
            p=p->next;
        }
        printf("\n");
    }
    PNODE *addPoly(PNODE *headA,PNODE *headB)
    {
        float sum=0;
        PNODE *p1,*p2,*p3,*r = NULL;  //修改
        p1=headA,p2=headB;
        headA=NULL,p3=NULL;
        while (p1 && p2)   //if(p1&&p2) 修改
        {
            if(p1->expn==p2->expn)
            {
                sum=p1->coef+p2->coef;
                if(sum==0)
                {
                   r=p1;
                   p1=p1->next;
                   free(r);
                   r=p2;
                   p2=p2->next;
                   free(r);
                }
                else{
                    p1->coef=sum;
                    if (!headA)  //修改
                        headA=p1;//修改
                    else         //修改
                        p3->next=p1;
                    p3 = p1;
                    p1=p1->next;//p1=p1=p1->next;
                    r=p2;
                    p2=p2->next;
                    free(r);
                }
            }
            else{
               if(p1->expn<p2->expn){
                   if (!headA)      //修改
                       headA = p1;
                   else             //修改
                       p3->next = p1;
                   p3 = p1;
                   p1=p1->next;
                   p3->next=NULL;
                   //if(p3!=NULL){ //修改
                   //    p3->next=p1;
                   //    p3=p1;
                   //    p1=p1->next;
                   //}
                   //else{
                   //    p3=p1;
                   //    p1=p1->next;
                   //    p3->next=NULL;
                   //}
               }
               else{
                   if (!headA)     //修改
                       headA = p2;
                   else           //修改
                       p3->next = p2;
                   p3 = p2;
                   p2=p2->next;
                   p3->next=NULL;
                   //if(p3!=NULL){ //修改
                   //    p3->next=p2;
                   //    p3=p2;
                   //    p2=p2->next;
                   //}
                   //else{
                   //    p3=p2;
                   //    p2=p2->next;
                   //    p3->next=NULL;
                   //}
               }
    
            }
        }
        p3->next = p1 ? p1 : p2; //修改
        return headA;            //修改
        //else{                 //修改
        //    if(p1!=NULL){
        //        p3->next=p1;
        //    }
        //    else{
        //        p3->next=p2;
        //    }
        //}
        //return p3;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月4日
  • 已采纳回答 1月27日
  • 创建了问题 1月27日

悬赏问题

  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示