数据结构多项式乘法c语言,c语言版数据结构(奇迹冬瓜)-链表实战(4)双链表解一元多项式相乘...

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

//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();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值