/************************************************************************
*
* 文件名:2.2.6.cpp
*
* 文件描述:实现多项式的加法及乘法运算
*
* 创建人: fdk
* 时 间: 2018-08-01
*
* 版本号:1.0
*
* 修改记录:链表的使用还不够熟练,不能自己独立完成需要多加练习
*
************************************************************************/
#include <iostream>
#include <cstdlib>
using namespace std;
/*定义结构体*/
typedef struct PolyNode
{
int coef; //系数
int expon; //指数
struct PolyNode *link; //指向下一个结点的指针
}*Polynomial;
/*比较函数*/
int Compare(int e1, int e2);
/*添加结点函数*/
void Attach(int coef, int expon, Polynomial *PtrRear);
/*多项式求和函数*/
Polynomial PolyAdd(Polynomial p1, Polynomial p2);
/*多项式求乘积函数*/
Polynomial PolyMul(Polynomial p1, Polynomial p2);
/*新建一个多项式链表,参考多项式和的函数,每个元素的值由键盘输入*/
Polynomial MakeNew(int n);
int main()
{
int m;
int n;
Polynomial M;//第一个多项式
Polynomial N;//第二个多项式
Polynomial Q;//第一个多项式加第二个多项式之和
Polynomial T;//第一个多项式和第二个多项式之积
cout << "请输入第一个多项式的项数!" << endl;
cin >> m;
M = MakeNew(m);
cout << "请输入第二个多项式的项数!" << endl;
cin >> n;
N = MakeNew(n);
Q = PolyAdd(M, N);
cout << "相加后的结果为:" << endl;
while (Q)
{
cout << Q->coef << " " << Q->expon << " ";
Q = Q->link;
}
cout << endl;
T = PolyMul(M, N);
while (T)
{
cout << T->coef << " " << T->expon << " ";
T = T->link;
}
return 0;
}
/*比较函数*/
int Compare(int e1, int e2)
{
if (e1 > e2)
{
return 1;
}
if (e1 < e2)
{
return -1;
}
if (e1 == e2)
{
return 0;
}
}
/*添加结点函数*/
void Attach(int coef, int expon, Polynomial *PtrRear)
{
/*由于在本函数中需要改变当前结果表达式尾项指针的值*/
/*所以函数传递进来的是结点指针的地址,*PtrRear指向尾项,是个二级指针*/
Polynomial p;
p = (Polynomial)malloc(sizeof(PolyNode)); //申请新结点
p->coef = coef;
p->expon = expon;
/*将p指向的新结点插入到当前结果表达式尾项的后面*/
(*PtrRear)->link = p;
*PtrRear = p; //链表尾指针指向新结点
}
/*多项式求和函数*/
Polynomial PolyAdd(Polynomial p1, Polynomial p2)
{
/*fronts链表头指针,rear链表尾指针,temp用于释放头结点*/
Polynomial fronts;
Polynomial rear;
Polynomial temp;
int sum;
/*为方便表头插入,先产生一个临时空结点作为结果多项式链表头*/
rear = (Polynomial)malloc(sizeof(PolyNode));
fronts = rear; //由fronts记录结果多项式链表头结点
/*当两个多项式都有非零项待处理时*/
while (p1 && p2)
{
switch (Compare(p1->expon, p2->expon))
{
/*比较p1和p2指数的大小将指数大的那一项添加到多项式中去*/
case 1:
Attach(p1->coef, p1->expon, &rear);
p1 = p1->link;
break;
case -1:
Attach(p2->coef, p2->expon, &rear);
p2 = p2->link;
break;
case 0:
sum = p1->coef + p2->coef;
/*如果系数和不为0,将相加后的系数作为参数添加到多项式中*/
if (sum)
{
Attach(sum, p1->expon, &rear);
}
p1 = p1->link;
p2 = p2->link;
break;
}
}
/*当p1和p2中有一个结束后,将另一个的剩余一次接入到后面*/
while (p1)
{
Attach(p1->coef, p1->expon, &rear);
p1 = p1->link;
}
while (p2)
{
Attach(p2->coef, p2->expon, &rear);
p2 = p2->link;
}
rear->link = NULL; //多项式的尾指针指向为空
/*利用临时变量temp将头结点删除,使fronts指针指向第一个元素*/
temp = fronts;
fronts = fronts->link;
free(temp);
return fronts;
}
/*新建一个多项式链表,参考多项式和的函数,每个元素的值由键盘输入*/
Polynomial MakeNew(int n)
{
Polynomial fronts,rear,temp;
int k,c[10],e[10];
fronts=(Polynomial)malloc(sizeof(struct PolyNode));
rear=fronts;
cout << "先输入系数后输入指数!" << endl;
for(k=0; k<n; k++)
{
cin>>c[k];
cin>>e[k];
Attach(c[k],e[k],&rear);
}
rear->link=NULL;
temp=fronts;
fronts=fronts->link;
free(temp);
return fronts;
}
/*多项式求乘积函数*/
Polynomial PolyMul(Polynomial p1, Polynomial p2)
{
/*创建一个链表P用于表示当前运算的中间状态*/
Polynomial pResult = NULL;
Polynomial CopyP2 = p2;
/*创建一个新的多项式TmpP*/
Polynomial TmpP;
/*让p1中的每一项和p2中的每一项相乘然后将获得到的多项式依次相加得到最后的结果*/
while (p1)
{
while (p2)
{
/*定义一个临时变量TmpP用来计算*/
TmpP = (Polynomial)malloc(sizeof(PolyNode));
TmpP->link = NULL;
TmpP->coef = (p1->coef)*(p2->coef); /*系数相乘指数相加*/
TmpP->expon = (p1->expon)+(p2->expon);
pResult = PolyAdd(pResult, TmpP);
p2 = p2->link;
}
/*将p2的指针重置,并将p1的指针移动到下一个位置*/
p2 = CopyP2;
p1 = p1->link;
}
return pResult;
}
单链表来实现多项式的加法和乘法运算
猜你喜欢
转载自blog.csdn.net/fdkNeverStopLearning/article/details/81347364
今日推荐
周排行