数据结构课后习题 实现多项式的加法 c语言版

使用单链表实现一元多项式的存储。
加法:
对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不等于0,则构成多项式中的一项;对于两个一元多项式中所有指数不相同的项,则将此节点添加到多项式链表中去。

减法:
先将B多项式链表的数据域取反 ,然后再进行加法运算。

乘法:
将A多项式中的某一项去乘B多项式中的每一项,A多项式中的每一项重复如此,系数加至合适指数的系数上。

只写了多项式的建立和加法,减法和乘除也只是在上面的步骤上对指数和系数进行操作!
输出是先系数后指数!

#include"stdio.h"
#include"stdlib.h"
typedef struct PolyNode *Polynomial;/*定义结点*/
struct PolyNode/*建立节点,coef为系数,expon为指数*/
{
    int coef;
    int expon;
    Polynomial link;
}; 
Polynomial ReadPoly();/读取链表,实际上是建立链表/
void PrintPoly(Polynomial P);/*打印链表*/
Polynomial Mult(Polynomial P1,Polynomial P2);/*相加*/
void Attach(int c,int e,Polynomial *prear);/*将节点链到PP链上作为输出(实际上就是建立链)*/
int main()/*主程序*/
{
    Polynomial P1,P2,PP,PS;
    P1 = ReadPoly();
    P2 = ReadPoly();
    PP = Mult(P1,P2);
    PrintPoly(PP);
}
Polynomial ReadPoly()
{
    int N,c,e;
    Polynomial P,t,rear;
    scanf("%d",&N);
    P = (Polynomial)malloc(sizeof(struct PolyNode));
    P->link=NULL;
    rear=P;
    while(N--)
    {
        scanf("%d %d",&c,&e);
        Attach(c,e,&rear);/*链到链表上*/
    }
    t=P;P=P->link;free(t);
    return P; 
}
void Attach(int c,int e,Polynomial *prear)
{
    Polynomial P;
    P = (Polynomial)malloc(sizeof(struct PolyNode));
    P->coef = c;
    P->expon = e;
    P->link =NULL;
    (*prear)->link =P;
    *prear=P;
}
Polynomial Mult(Polynomial P1,Polynomial P2)/*求和*/
{
    Polynomial t1,t2,rear,P,q;
    t1=P1;t2=P2;
    P =(Polynomial)malloc(sizeof(struct PolyNode));
    P->link = NULL;
    rear = P;
    while(t1&&t2)/*进行比较将节点链到链表上*/
    {
        if(t1->expon == t2->expon)/*比较指数,求出对应的节点系数*/
        {
            if(t1->coef+t2->coef!=0)
            Attach(t1->coef+t2->coef,(t1->expon+t2->expon)/2,&rear);
            t2=t2->link;t1=t1->link;
        }
        else if(t1->expon>t2->expon)
        {
            Attach(t2->coef,t2->expon,&rear);
            t2=t2->link;
        }
        else
        {
            Attach(t1->coef,t1->expon,&rear);
            t1=t1->link;
        }
     } 
     while(t1)/*如果有剩下将剩下的链补上*/
     {
            Attach(t1->coef,t1->expon,&rear);
            t1=t1->link;
     }
      while(t2)
     {  
        Attach(t2->coef,t2->expon,&rear);
            t2=t2->link;
     }
     rear->link=NULL;
     q=P;
     P=P->link;
     free(q);/*将我们之前申请的头节点释放掉*/
     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->link;
    }
    printf("\n");
}

你可能感兴趣的:(数据结构,算法,C语言)