用单向链表计算多项式的加法

来源:互联网 发布:手机淘宝商城首页登录 编辑:程序博客网 时间:2024/06/06 15:49

如果用数列表示多项式,可能会造成很大的空间浪费,我们这里利用单向链表表示多项式,并进行加法运算,其中多项式采用不带头结点的单向链表,按照指数递减的顺序排列各项,定义的链表结构是

struct PolyNode{int coef;int expon;struct PolyNode *link;};typedef struct PolyNode *Polynomial;
算法思路:

1.P1->expon==P2->expon:系数相加,若结果不为0,则作为结果多项式对应项的系数。同事,P1和P2都分别指向下一项;

2.P1->expon>P2->expon:将P1的当前项存入结果多项式,并使P1指向下一项

3..P1->expon<P2->expon:将P2的当前项存入结果多项式,并使P2指向下一项

当某一多项式处理完时,将另一个多项式的所有节点依次复制到结果多项式中去


具体流程如图上所示

其中最主要的函数如下图



值得注意的是Attach函数,传递的是指针


完整的代码

#include <stdio.h>    #include <stdlib.h>struct PolyNode{int coef;int expon;struct PolyNode *link;};typedef struct PolyNode *Polynomial;//读入多项式Polynomial Read();//输出多项式void Print(Polynomial P);//多项式相加Polynomial PolyAdd(Polynomial P1,Polynomial P2);void Attach(int c,int e,Polynomial *pRear);int Compare(int a, int b);    int main()    {        Polynomial P1=Read();Polynomial P2=Read();Print(P1);    Print(P2);Polynomial P=PolyAdd(P1,P2);Print(P);        return 0;    }//读入多项式Polynomial Read()    {      int coef = 0;    int expon = 0;    Polynomial P = NULL;    PolyNode *last = NULL;  PolyNode *temp=NULL;      P = ( Polynomial )malloc( sizeof( struct PolyNode ) );//建立头结点    P->link = NULL;    last = P;        scanf( "%d",&coef );  scanf( "%d",&expon );  while(expon>=0){        PolyNode *node = ( PolyNode *)malloc( sizeof( struct PolyNode ) );  node->coef=coef;     node->expon = expon;      last->link = node;      last = node;  scanf( "%d",&coef );  scanf( "%d",&expon );  }  last->link=NULL;  temp=P;  P=P->link;  free(temp);  return P;  }//输出多项式void Print(Polynomial P){Polynomial Q=P;while(Q){printf("系数%d 指数%d   ",Q->coef,Q->expon);Q=Q->link;}printf("\n");}//多项式相加Polynomial PolyAdd(Polynomial P1,Polynomial P2){Polynomial front,rear,temp;int sum;rear=(Polynomial)malloc(sizeof(struct PolyNode));front=rear;while(P1&&P2){switch(Compare(P1->expon,P2->expon)){case 1:Attach(P1->coef,P1->expon,&rear);P1=P1->link;break;case -1:    Attach(P2->coef,P2->expon,&rear);    P2=P2->link;break;case 0:sum=P1->coef+P2->coef;if(sum)Attach(sum,P1->expon,&rear);P1=P1->link;P2=P2->link;break;}}for(;P1;P1=P1->link)Attach(P1->coef,P1->expon,&rear);for(;P2;P2=P2->link)Attach(P2->coef,P2->expon,&rear);rear->link=NULL;temp=front;front=front->link;free(temp);return front;}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;}int Compare(int a, int b){if(a>b)return 1;else if(a<b) return -1;else return 0;}
运行的结果是

看起来是没错的,嘿嘿

1 0