//c语言版数据结构(奇迹冬瓜)-链表实战(3)解升序排列的一元多项式相加
/*
主要函数思想:
初始化一元多项式A
初始化一元多项式B
初始化一元多项式C
给一元多项式A赋入数据
给一元多项式B赋入数据(指数升序)
当A的结点或者B的结点项的下一项不为空
{
比较AB的指数
{
定位当前结点A的指数,定位当前结点B的指数.
如果A的结点指数<B的结点指数(C的下一个结点为当前A的结点,A移动结点)
如果A的结点指数=B的结点指数(如果系数A+B=0,A,B结点都移动)
如果A的结点指数>B的结点指数(C的下一个结点为当前B的结点,B移动结点)
}
}
当A的结点不为空
{
c链接A接下来的结点
}
当B的结点不为空
{
c链接B接下来的结点
}
输出
*/
//---------头文件----------
#include<stdio.h>
#include<stdlib.h>
//---------宏定义----------
#define TRUE 1
#define ERROR 0
#define OVERFLOW -2
//-----结构体和替换名------
typedef struct Node
{
float coef;
int expn;
struct Node *next;
}Poly,*Polynomial;
//------函数-------
int InitPolynomial(Polynomial f);
int InputData(Polynomial f);
int Compare(int c1,int c2);
int JudgeCoefZero(float a1,float a2);
void OutPut(Polynomial f);
//-----主函数-----
void main()
{
Poly A,B,C,*f1=&A,*f2=&B,*f3=&C;
int d;
InitPolynomial(f1);InitPolynomial(f2);InitPolynomial(f3);
InputData(f1);InputData(f2);
f1=f1->next;
f2=f2->next;
while(f1&&f2)
{
d=Compare(f1->expn,f2->expn);
switch(d)
{
case -1:f3->next=f1;f1=f1->next;f3=f3->next;break;
case 0:if(!JudgeCoefZero(f1->coef,f2->coef))
{
f1->coef+=f2->coef;
f3->next=f1;
f3=f3->next;
}
f1=f1->next;
f2=f2->next;
break;
case 1:f3->next=f2;f2=f2->next;f3=f3->next;break;
}
}
if(f1)
{
f3->next=f1;
}
if(f2)
{
f3->next=f2;
}
OutPut(&C);
}
int InitPolynomial(Polynomial f)
{
if(!(f=(Polynomial)malloc(sizeof(Poly))))
{
exit(OVERFLOW);
}
f->next=NULL;
return TRUE;
}
int InputData(Polynomial f)
{
Polynomial StartNode=f,Tempf=f,NewNode;
int n;
printf("输入多项式的项数:");
do
{
scanf("%d",&n);
if(n<0)
{
printf("输入错误!重新输入.\n");
}
}while(n<0);
printf("按升序输入一元多项式的系数和指数:\n");
for(;n>0;n--)
{
if(!(NewNode=(Polynomial)malloc(sizeof(Poly))))
{
exit(OVERFLOW);
}
scanf("%f%d",&NewNode->coef,&NewNode->expn);
Tempf->next=NewNode;
NewNode->next=NULL;
Tempf=NewNode;
}
f=StartNode;
return TRUE;
}
int Compare(int c1,int c2)
{
if(c1>c2)
{
return 1;
}
else if(c1==c2)
{
return 0;
}
else
{
return -1;
}
}
int JudgeCoefZero(float a1,float a2)
{
return 0==a1+a2?1:0;
}
void OutPut(Polynomial f)
{
f=f->next;
printf("f(x)=");
while(f)
{
if(f->expn)
{
printf("%fx^%d",f->coef,f->expn);
}
else
{
printf("%f",f->coef);
}
f=f->next;
if(f&&f->coef>0)
{
printf("+");
}
}
getchar();
getchar();
}