cwr1001 发表于 2017-10-20 11:02:36

一元多项式加法

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

//定义结构体变量一元多项式 系数 指数 下一个节点
typedef struct PolyNode
{
        float coaf;//系数
        int exp;//指数
        struct PolyNode *link;//指针域

}PolyNode,*PolyLinkList;


//后插法创建两个单链表
struct PolyNode *creatListF(int n)
{
       
       
        struct PolyNode *head,*q,*r;//q 新增加的节点r 当前节点
        int coef,exp,i;
        head =(struct PolyNode *)malloc (sizeof(struct PolyNode));
        r=head;
for(i=1;i<n;i++)
{
        scanf("%f%d",&coef,&exp);
        q=(struct PolyNode *)malloc (sizeof(struct PolyNode));
        r->link=q;
        q->coaf=coef;
        q->exp=exp;
        r=q;
       
}
        r->link=NULL;
        return head;
}



//算法 多项式相加
struct PolyNode *add_poly(struct PolyNode *AH,struct PolyNode *BH)
{
        struct PolyNode *p1,*q1,*r,*s;//A、B链表的当前指针 和链表的当前指针 S指向要删除的节点
        p1=AH->link;//第一个节点
        q1=BH->link;
        r=AH->link;
        while(p1!=NULL&&q1!=NULL)
        {
                        //判断 指数是否相等
                        if(p1->exp==q1->exp)
        {
                //判断系数相加是否为零
                int x = q1->exp+q1->exp;
                if(x!=0)
                {
                        //p1系数改变 和链表头结点指向p1 q1对应free q1 指向后移q1指向后移
                        p1->coaf=x;
                        r->link=p1;
                        r=p1;
                        p1=p1->link;
                        s=q1;
                        free(s);
                        q1=q1->link;
                }
                else
                {//两个链表的当前指针同时后移
                        s=p1;free(s);p1=p1->link;
                        s=q1;free(s);q1=q1->link;

                }
        }
        else if(p1->exp<q1->exp)
        {
                //和链表指向拥有指数小节点的链表
                r->link=p1;r=p1;p1=p1->link;

        }
        else
        {
                r->link=q1;r=q1;q1=q1->link;
        }//剩余节点
        if(p1!=NULL){r->link=p1;};
        if(q1!=NULL){r->link=q1;};
        }
        free(BH);
        return AH;
}

//遍历
void DispList(PolyNode *l)
{
        //输出每一个节点
        //p为当前节点
        PolyNode *p = l->link;
        while(p!=NULL)
        {
                printf("%fx%d",p->coaf,p->exp);
                p=p->link;
        }
        printf("\n");
}
int main ()
{
        PolyNode *A;
        PolyNode *B;
       
        A=creatListF(5);
        DispList(A);
        printf("\n");
       
        B=creatListF(5);
        DispList(B);
        printf("\n");
       
        add_poly(A,B);
        DispList(A);
       
        return 0;

}


不知道为什么输出结果是这样的

Crazy_Snail 发表于 2017-10-22 18:16:32

21行,int coef,exp,i;;改成float ceof;
display函数改成:void DispList(PolyNode *l)
{
    //输出每一个节点
    //p为当前节点
    PolyNode *p = l->link;
    while (p->link != NULL)
    {
      printf("%.1fx^%d + ", p->coaf, p->exp);
      p = p->link;
    }
    printf("%.1fx^%d", p->coaf, p->exp);
    printf("\n");
}

cwr1001 发表于 2017-10-24 14:46:02

Crazy_Snail 发表于 2017-10-22 18:16
21行,改成
display函数改成:

谢谢   不过能不能给我解释一下为什么么

不自律的笨鸟 发表于 2021-5-15 07:34:23

看来还有很多东西要学习啊!
页: [1]
查看完整版本: 一元多项式加法