如果用数列表示多项式,可能会造成很大的空间浪费,我们这里利用单向链表表示多项式,并进行加法运算,其中多项式采用不带头结点的单向链表,按照指数递减的顺序排列各项,定义的链表结构是
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;
}
运行的结果是
看起来是没错的,嘿嘿