基于链式存储结构实现两个多项式的乘法问题,
例如多项式A = 2x3 + 3x + 1,多项式B = 5x4 + 2x3 - 3x2 – 3,
则A * B = 10x7 + 4x6 + 9x5 + 11x4 -13x3 – 3x2 – 9x – 3。
#include <iostream>
#define ok 1
#define error 0
using namespace std;
typedef int status;
typedef int ElemType;
//定义
typedef struct PNode
{
float coef; //系数
int expn; //指数
struct PNode *next; //指针域
}PNode, *Polynomial;
//声明
status InitList(Polynomial &P);
status CreatePolyn(Polynomial &P);
status Mult_Poly(Polynomial Pa, Polynomial Pb,Polynomial &P);
status sort(Polynomial &P);
status merge(Polynomial &P);
status del_coef(Polynomial &P);
status DispList(Polynomial P);
void Link(Polynomial P );
//主函数
int main()
{
int n;
float coef;
int expn;
Polynomial P;
InitList(P);
Polynomial Pa;
Polynomial Pb;
InitList(Pa);
InitList(Pb);
cout << "请输入多项式A (以0 0结束):" << endl;
CreatePolyn(Pa);
cout << endl;
cout << "请输入多项式B (以0 0结束):" << endl;
CreatePolyn(Pb);
cout << endl;
cout << "多项式Pa和Pb相乘后的结果是:" << endl;
Mult_Poly(Pa, Pb,P);
DispList(P);
cout << endl;
cout << "按指数排序后的结果是:" << endl;
sort(P);
DispList(P);
cout << endl;
cout << "合并重复项后的结果是:" << endl;
merge(P);
DispList(P);
cout << endl;
cout << "删除系数为0的项后的结果是:" << endl;
del_coef(P);
DispList(P);
return 0;
}
//初始化
status InitList(Polynomial &P)
{
P = new PNode; //先建立一个带头结点的单链表
P->next = NULL; //初始化单链表next域置空
return ok;
}
//创建
status CreatePolyn(Polynomial &P)
{
PNode *p = P; //指针p指向头结点
int i = 1; //i记录第几项
float coef; //系数
int expn; //指数
while (1)
{
cout << "请输入第" << i << "项的系数和指数:" << endl;
cin >> coef >> expn ; //输入系数和指数
if (coef == 0 && expn == 0) //以0 0结束
break;
else
{
PNode *s = new PNode; //生成新结点
s->coef = coef; //将输入的系数存放在新结点的系数域
s->expn = expn; //将输入的指数存放在新结点的指数域
p->next = s; //将新结点链接在头结点之后
s->next = NULL; //新结点next域置空
p = s; //p指向新结点s
i++;
}
}
return ok;
}
//乘法
status Mult_Poly(Polynomial Pa, Polynomial Pb,Polynomial &P)
{ //第一个多项式的每一项分别乘第二个多项式的每一项
PNode *p1 = Pa->next; //p1指向Pa的首元结点
PNode *p= P; //p指向头结点
p->next = NULL; //p的next域置空
while (p1 != NULL) //如果p1不为空
{
PNode *p2 = Pb->next; //p2指向Pb的首元结点
while (p2 != NULL)
{
PNode *q = new PNode; //生成新结点q,用来存放相乘后的结点
q->next = NULL;
q->coef = (p1->coef) * (p2->coef); //系数相乘
q->expn = (p1->expn) + (p2->expn); //指数相加
p->next = q; //将相乘后的新结点q存放在p的next域中
p = q; //p指向q
p2 = p2->next; //p2后移
}
p1 = p1->next; //p2为空,内层循环结束,进入外循环,p1后移
}
return ok;
}
//排序
status sort(Polynomial &P)
{
float coef;
int expn;
PNode *p = P->next; //p指向首元结点
while (p->next)
{
PNode *q = p->next; //q指向p的后继结点
while (q)
{
if (p->expn < q->expn) //如果后继结点比当前结点的指数大,就交换结点值
{
coef = p->coef;
expn = p->expn;
p->coef = q->coef;
p->expn = q->expn;
q->coef = coef;
q->expn= expn;
}
q = q->next; //后继结点q后移
}
p = p->next; //内层循环结束当前结点p后移
}
return ok;
}
//合并同类项
status merge(Polynomial &P)
{
sort(P); //排序
PNode *p = P->next; //p指向首元结点
float sum; //用来保存指数相同时的,两个结点的系数
PNode *q = p->next; //q指向p的后继
while (p->next)
{
if (p->expn == q->expn) //指数相等
{
sum = (p->coef + q->coef); //指数相加
p->coef = sum; //将相加后的系数赋给首元结点的系数域
PNode *r = q; //生成新结点r指向q
q = q->next; //q后移
p->next = q; //将q链接在p的后面
delete r; //删除q
}
else //指数不相等
{
p = q;
q = q->next;
}
}
return ok;
}
//删除系数为0的项的结果是
status del_coef(Polynomial &P)
{
PNode *p = P->next;
while (p != NULL)
{
if (p->coef == 0) //如果系数等于0
{
PNode *q = p->next; //删除当前结点
delete p;
p = q;
}
else //否则,p指针后移
p = p->next;
}
}
//输出
status DispList(Polynomial P)
{
PNode *p = P->next;
while (p->next)
{
if (p->coef > 0)
{
if (p->expn == 0)
cout << "(" << p->coef << ")" << ' '<< "*" << ' ' << "x^" << p->expn << ' ' << "+" << ' ';
else
cout << "(" << p->coef << ")" << ' ' <<"*" << ' ' << "x^" << p->expn << ' ' << "+" << ' ';
}
if (p->coef < 0)
{
if (p->expn == 0)
cout << "(" << p->coef << ")" << ' '<< "*" << ' ' << "x^" << p->expn << ' ' << "+" << ' ';
else
cout << "(" << p->coef << ")" << ' '<< "*" << ' ' << "x^" << p->expn << ' ' << "+" << ' ';
}
p = p->next;
}
cout << "(" << p->coef << ")" << ' '<< "*" << ' ' << "x^" << p->expn << ' ' ;
return ok;
}