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

来源:互联网 发布:知乎武林外传细思极恐 编辑:程序博客网 时间:2024/04/29 12:09

使用单链表实现一元多项式的存储。
加法:
对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不等于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");}
0 0
原创粉丝点击