//c语言版数据结构(奇迹冬瓜)-链表实战(4)双链表解一元多项式相乘
/*
主要函数思想:
初始化一元多项式A
初始化一元多项式B
初始化一元多项式C
给一元多项式A赋入数据
给一元多项式B赋入数据(指数升序)
把AB各项累乘放入C中
用双指针的模式消除合并累加最后得到结果
输出
*/
//---------头文件----------
#include
#include
//---------宏定义----------
#define TRUE 1
#define ERROR 0
#define OVERFLOW -2
//---------结构体和替换--------
typedef int Bool;
typedef struct Node
{
float coef;
int expn;
struct Node *prior,*next;
}Poly,*Polynomial;
//------函数-------
Bool InitPolynomial(Polynomial f);
Bool InputData(Polynomial f);
void Multiply(Polynomial f1,Polynomial f2,Polynomial f3);
void Add(Polynomial f3);
void OutputData(Polynomial f3);
//-----------主函数------------
void main()
{
Poly A,B,C,*f1=&A,*f2=&B,*f3=&C;
InitPolynomial(f1);InitPolynomial(f2);InitPolynomial(f3);
InputData(f1);InputData(f2);
Multiply(f1,f2,f3);
Add(f3);
OutputData(f3);
}
//---------其余函数---------
Bool InitPolynomial(Polynomial f)
{
if(!(f=(Polynomial)malloc(sizeof(Poly))))
{
exit(OVERFLOW);
}
f->next=NULL;
f->prior=NULL;
return TRUE;
}
Bool InputData(Polynomial f)
{
Polynomial StartNode=f,TempNode=f,NewNode;
int n;
printf("输入多项式的项数:");
do
{
scanf("%d",&n);
if(n<0)
{
printf("输入项数错误!重新输入!");
}
}while(n<0);
printf("按升序输入一元多项式的系数和指数:\n");
for(;n>0;n--)
{
if(!(NewNode=(Polynomial)malloc(sizeof(Poly))))
{
exit(OVERFLOW);
}
scanf("%f%d",&NewNode->coef,&NewNode->expn);
TempNode->next=NewNode;
NewNode->prior=TempNode;
NewNode->next=NULL;
TempNode=NewNode;
}
f=StartNode;
return TRUE;
}
void Multiply(Polynomial f1,Polynomial f2,Polynomial f3)
{
Polynomial StartNode=f3,TempNode=f3,NewNode,Point1=f1->next,Point2;
while(Point1)
{
Point2=f2->next;
for(;Point2;Point2=Point2->next)
{
if(!(NewNode=(Polynomial)malloc(sizeof(Poly))))
{
exit(OVERFLOW);
}
NewNode->coef=Point1->coef*Point2->coef;
NewNode->expn=Point1->expn+Point2->expn;
TempNode->next=NewNode;
NewNode->prior=TempNode;
NewNode->next=NULL;
TempNode=NewNode;
}
Point1=Point1->next;
}
f3=StartNode;
}
void Add(Polynomial f3)
{
Polynomial Point1=f3->next,Point2,StartNode=f3,Temp;
while(Point1)
{
for(Point2=Point1->next;Point2;)
{
if(Point1->expn==Point2->expn)
{
Point1->coef+=Point2->coef;
Temp=Point2;
Point2=Point2->next;
Temp->prior->next=Temp->next;
Temp->next->prior=Temp->prior;
//DeleteNode(f3,i);
}
else
{
Point2=Point2->next;
}
}
if(0==Point1->coef)
{
Temp=Point1;
Point1=Point1->next;
Temp->prior->next=Temp->next;
Temp->next->prior=Temp->prior;
}
else
{
Point1=Point1->next;
}
}
f3=StartNode;
}
void OutputData(Polynomial f3)
{
f3=f3->next;
printf("f(x)=");
while(f3)
{
if(f3->expn)
{
printf("%.0fx^%d",f3->coef,f3->expn); //这里数据为了好看为.0格式,其实不应该要的,因为是浮点型数据,而这里的浮点型恰好不为小数。
}
else
{
printf("%.0f",f3->coef);
}
f3=f3->next;
if(f3&&f3->coef>0)
{
printf("+");
}
}
getchar();
getchar();
}