题目要求:
实现任意两个多项式的加和乘操作
代码实现:
#define OK 1
#define ERROR 0
typedef int ElemType;
#include <iostream>
#include <iomanip>
#include <stdlib.h>
using namespace std;
typedef struct pnode
{
double coef; //系数
int expn; //指数
}pnode;
typedef struct LNode
{
pnode data;
LNode* next;
}LNode, * LinkList;
int InitList_L(LinkList& L)
{
L = new LNode;
if (!L) exit(OVERFLOW);
L->next = NULL;
return OK;
}
int CreateList_L(LinkList& L, int n)
{
L = new LNode;
L->next = NULL;
for (int i = 0; i <n; i++)
{
LNode* p= new LNode;
cin >>p-> data.expn >> p->data.coef ; //尾插法,从指数大的降序输入
p->next = L->next;
L->next = p;
}
return OK;
}
//两多项式相加
void AddList_L(LinkList& La, LinkList& Lb, LinkList& Lc)
{
LNode* pa = La->next;
LNode* pb = Lb->next;
LNode* pc = Lc;
while (pa!=NULL&&pb!=NULL)
{
LNode* S = new LNode;
if (pa->data.expn < pb->data.expn) //遍历比较La和Lb的指数大小,先存放指数小的项
{
S->data.expn = pa->data.expn; //a,b中的指数赋值给c
S->data.coef = pa->data.coef;
pc ->next= S;
pa = pa->next;
}
else if (pa->data.expn > pb->data.expn)
{
S->data.expn = pb->data.expn;
S->data.coef = pb->data.coef;
pc ->next= S;
pb = pb->next;
}
else
{
S->data.coef = pa->data.coef + pb->data.coef;
S->data.expn= pa->data.expn;
pc->next = S;
pa = pa->next;
pb = pb->next;
}pc = S; //S作为Lc链表的新表尾
}
if (pa != NULL)
{
while (pa != NULL)
{
LNode* S = new LNode;
S->next = NULL;
S->data = pa->data;
pc->next = S;
pc = S;
pa = pa->next;
}
}
if (pb != NULL)
{
while (pb != NULL)
{
LNode* S = new LNode;
S->next = NULL;
S->data = pb->data;
pc->next = S;
pc = S;
pb = pb->next;
}
}
//pc->next = pa?pa:pb; //剩余项归并到La
}
//两多项式相乘
LNode* MultiplyList_L(LinkList& La, LinkList& Lb, LinkList &Lc)
{
LNode* pa = La->next;
LNode* pc = Lc;
while (pa)
{
LNode* pb = Lb->next;
while (pb)
{
LNode* S = new LNode; //建立插入Lc的新结点
S->data.coef=pb->data.coef * pa->data.coef; //系数相乘
S->data.expn = pb->data.expn + pa->data.expn; //指数相乘
pc->next = S; //在Lc表尾插入新结点
S->next = NULL;
pb = pb->next;
pc = S; //S作为Lc链表的新表尾
}
pa = pa->next;
}
return Lc;
}
//合并Lc中指数相同的项
ElemType merge_Elem_L(LinkList& Lc)
{
LNode* pc = Lc->next; //pc指向多项式首项
while (pc != NULL)
{
LNode* pcc = pc; //pcc指向pc的后一项
while (pc != NULL && pcc != NULL && pcc->next != NULL)
{
if (pc->data.expn == pcc->next->data.expn)
{
LNode* f = pcc->next->next;
pc->data.coef += pcc->next->data.coef;
if (f != NULL)
{
pcc->data = f->data;
pcc->next = f->next;
delete f;
}else{
delete pcc->next;
pcc->next = NULL;
}
}
pcc = pcc->next;
}
pc = pc->next;
}
return OK;
}
// 打印输出多项式
void ShowList_L(LinkList& L)
{
LNode* p = L->next;
if (!p) { cout << "Empty LinkList!" << endl; return; }
if(p->data.coef)
cout<< p->data.coef << '*' << "X" << '^'<< p->data.expn ;
p = p->next;
while (p)
{
if(p->data.coef==1)
cout <<" + " << "X" << '^' << p->data.expn ;
else if (p->data.coef < 0)
cout << p->data.coef <<'*' << "X" << '^' << p->data.expn;
else
cout << " + "<<p->data.coef<<'*' << "X" << '^' << p->data.expn;
p = p->next;
}
cout << endl << endl;;
}
int DestoryList_L(LinkList& L)
{
LNode* p = L;
while (L)
{
p = L;
L = L->next;
delete p;
}
return OK;
}
int main()
{
LinkList La, Lb, Lc;
//构造空单链表
InitList_L(La);
InitList_L(Lb);
InitList_L(Lc);
//创建一元多项式
CreateList_L(La, 4);
cout << "一元多项式a为:" << endl;
ShowList_L(La);
CreateList_L(Lb, 3);
cout << "一元多项式b为:" << endl ;
ShowList_L(Lb);
//两多项式相加
AddList_L(La, Lb, Lc);
cout << "两个多项式相加后的结果为:" << endl;
ShowList_L(Lc);
两多项式相乘
LinkList Lcc=MultiplyList_L(La, Lb, Lc);
merge_Elem_L(Lcc);
cout << "两个多项式相乘后的结果为:" << endl;
ShowList_L(Lc);
DestoryList_L(La);
DestoryList_L(Lb);
DestoryList_L(Lc);
return OK;
}