经过一次计算之后,再经过依次计算,就不出结果
#include<iostream>
using namespace std;
typedef int Status;
//链式多项式的创建
typedef struct PNode
{
float coef ;
int expn ;
struct PNode *next ;
}PNode,*Polynomial ;
//创建多项式
void CreatePolyn(Polynomial &P,int n)
{
int i ;
P=new PNode ;
P->next = NULL ;
cout<<"请分别输入多项式的系数和指数!"<<endl;
for(i=1 ; i<=n ; ++i)
{
Polynomial s = new PNode ;
cin>>s->coef>>s->expn ;
Polynomial pre = P ;
Polynomial q = P->next ;
while(q&&q->expn<s->expn )
{
pre = q ;
q = q->next ;
}
s->next = q ;
pre->next = s ;
}
}
//多项式的相加
void AddPolyn(Polynomial &Pa,Polynomial &Pb)
{
Polynomial p1 = Pa->next ; Polynomial p2 = Pb->next ;
Polynomial p3 = Pa ;
while(p1&&p2)
{ float sum = 0 ;
if(p1->expn == p2->expn )
{
sum = p1->coef + p2->coef ;
if(sum!=0)
{
p1->coef = sum;
p3->next = p1 ; p3 = p1 ;
p1 = p1->next ;
Polynomial r = p2 ; p2 = p2->next ; delete r ;
}
else
{
Polynomial r ;
r = p1 ; p1 = p1->next ; delete r ;
r = p2 ; p2 = p2->next ; delete r ;
}
}
else if(p1->expn < p2->expn)
{
p3->next = p1 ;
p3 = p1 ;
p1 = p1->next ;
}
else
{
p3->next = p2 ;
p3 = p2 ;
p2 = p2->next ;
}
}
p3->next = p1 ? p1 : p2 ;
delete Pb;
Polynomial p4 = Pa->next;
while (p4)
{
cout << p4->coef << "x^" << p4->expn ;
if(p4->next)
cout << "+" ;
p4 = p4->next ;
}
cout << endl ;
}
void Cutpolyn(Polynomial &Pa,Polynomial &Pb)
{
Polynomial p1 = Pa->next ; Polynomial p2 = Pb->next ;
Polynomial p3 = Pa ;
while(p1&&p2)
{ float sum = 0 ;
if(p1->expn == p2->expn )
{
sum = p1->coef - p2->coef ;
if(sum!=0)
{
p1->coef = sum;
p3->next = p1 ; p3 = p1 ;
p1 = p1->next ;
Polynomial r = p2 ; p2 = p2->next ; delete r ;
}
else
{
Polynomial r ;
r = p1 ; p1 = p1->next ; delete r ;
r = p2 ; p2 = p2->next ; delete r ;
}
}
else if(p1->expn < p2->expn)
{
p3->next = p1 ;
p3 = p1 ;
p1 = p1->next ;
}
else
{
p3->next = p2 ;
p3 = p2 ;
p2 = p2->next ;
}
}
p3->next = p1 ? p1 : p2 ;
delete Pb;
Polynomial p4 = Pa->next;
while (p4)
{
cout << p4->coef << "x^" << p4->expn ;
if(p4->next)
cout << "+" ;
p4 = p4->next ;
}
cout << endl ;
}
int main()
{
int a,b=1;
Polynomial(P) ;
Polynomial Pa ;
Polynomial Pb ;
cout<<"请选择你要进行的操作: "<<endl;
while(b)
{
cout<<"--------------------------------------------------------------------------"<<endl;
cout<<"1.创建多项式 2.多项式相加 3.多项式相减 4.退出操作"<<endl;
cin>>a;
switch(a)
{ int n,m;
case(1): cout<<"请输入Pa的项数: "<<endl ; cin>>n ;
CreatePolyn(Pa,n) ;
cout<<"请输入Pb的项数: "<<endl ; cin>>m ;
CreatePolyn(Pb,m) ; break ;
case(2): AddPolyn(Pa,Pb) ; break ;
case(3): Cutpolyn(Pa,Pb) ; break ;
case(4): exit(0) ;
default: printf("输入有误!请重新输入!") ;
}
}
return 0;
}
只要一个函数就可以实现相加、减,整体修改如下,改动处见注释,供参考:
#include<iostream>
using namespace std;
typedef int Status;
//链式多项式的创建
typedef struct PNode
{
float coef ;
int expn ;
struct PNode *next ;
}PNode,*Polynomial ;
//创建多项式
void CreatePolyn(Polynomial &P,int n)
{
int i ;
P=new PNode ;
P->next = NULL ;
cout<<"请分别输入多项式的系数和指数!"<<endl;
for(i=1 ; i<=n ; ++i)
{
Polynomial s = new PNode ;
cin>>s->coef>>s->expn ;
Polynomial pre = P ;
Polynomial q = P->next ;
while(q&&q->expn<s->expn )
{
pre = q ;
q = q->next ;
}
s->next = q ;
pre->next = s ;
}
}
//多项式的相加、减
void Add_Cut_Polyn(Polynomial Pa,Polynomial Pb,int flag = 0)// flag为加 减标志位:0 表示 + ,1 表示 -
//void AddPolyn(Polynomial &Pa,Polynomial &Pb) // 修改
{
if ((!Pa || !Pa->next) && (!Pb || !Pb->next)) return; // 修改
Polynomial p1 = Pa->next, p2 = Pb->next ;
//Polynomial p3 = Pa ; // 修改
Polynomial p3 = new PNode, pt3 = p3, p = NULL; // 修改
p3->next = NULL;
while(p1 && p2)
{
float sum = 0 ;
if(p1->expn == p2->expn )
{
sum = flag ? p1->coef - p2->coef : p1->coef + p2->coef;
if(sum != 0)
{
p = new PNode;
p->next = NULL;
p->coef = sum;
p->expn = p1->expn;
//p1->coef = sum; // 修改
pt3->next = p ;
pt3 = p ;
//p1 = p1->next; // 修改
//Polynomial r = p2 ; p2 = p2->next ; delete r ; // 修改
}
p1 = p1->next;
p2 = p2->next;
//else // 修改
//{
// Polynomial r ;
// r = p1 ; p1 = p1->next ; delete r ;
// r = p2 ; p2 = p2->next ; delete r ;
// }
}
else if(p1->expn < p2->expn)
{
p = new PNode;
p->next = NULL;
p->coef = p1->coef;
p->expn = p1->expn;
pt3->next = p;
pt3 = p ;
p1 = p1->next ;
}
else
{
p = new PNode;
p->next = NULL;
p->coef = p2->coef;
p->expn = p2->expn;
pt3->next = p ;
pt3 = p;
p2 = p2->next ;
}
}
p1 = p1 ? p1 : p2 ; //p3->next = p1 ? p1 : p2 ; 修改
//delete Pb;
while(p1) // 修改
{
p = new PNode;
p->next = NULL;
p->coef = p1->coef;
p->expn = p1->expn;
pt3->next = p;
pt3 = p ;
p1 = p1->next ;
}
Polynomial p4 = p3->next;// 修改
pt3 = p3; // 修改
while (p4)
{
cout << p4->coef << "x^" << p4->expn ;
if (p->next && p->next->coef > 0) // 修改
cout << "+" ;
delete pt3; // 修改
pt3 = p4; // 修改
p4 = p4->next ;
}
delete pt3; // 修改
cout << endl ;
}
int main()
{
int a,b=1;
Polynomial(P) ;
Polynomial Pa ;
Polynomial Pb ;
cout<<"请选择你要进行的操作: "<<endl;
while(b)
{
cout<<"--------------------------------------------------------------------------"<<endl;
cout<<"1.创建多项式 2.多项式相加 3.多项式相减 4.退出操作"<<endl;
cin>>a;
switch(a)
{ int n,m;
case(1): cout<<"请输入Pa的项数: "<<endl ; cin>>n ;
CreatePolyn(Pa,n) ;
cout<<"请输入Pb的项数: "<<endl ; cin>>m ;
CreatePolyn(Pb,m) ; break ;
case(2): Add_Cut_Polyn(Pa,Pb,0) ; break ; // 修改
case(3): Add_Cut_Polyn(Pa,Pb,1) ; break ; // 修改
case(4): exit(0) ;
default: printf("输入有误!请重新输入!") ;
}
}
return 0;
}
// 以下代码删除
void Cutpolyn(Polynomial &Pa,Polynomial &Pb)
{
Polynomial p1 = Pa->next ; Polynomial p2 = Pb->next ;
Polynomial p3 = Pa ;
while(p1&&p2)
{ float sum = 0 ;
if(p1->expn == p2->expn )
{
sum = p1->coef - p2->coef ;
if(sum!=0)
{
p1->coef = sum;
p3->next = p1 ; p3 = p1 ;
p1 = p1->next ;
Polynomial r = p2 ; p2 = p2->next ; delete r ;
}
else
{
Polynomial r ;
r = p1 ; p1 = p1->next ; delete r ;
r = p2 ; p2 = p2->next ; delete r ;
}
}
else if(p1->expn < p2->expn)
{
p3->next = p1 ;
p3 = p1 ;
p1 = p1->next ;
}
else
{
p3->next = p2 ;
p3 = p2 ;
p2 = p2->next ;
}
}
p3->next = p1 ? p1 : p2 ;
delete Pb;
Polynomial p4 = Pa->next;
while (p4)
{
cout << p4->coef << "x^" << p4->expn ;
if(p4->next)
cout << "+" ;
p4 = p4->next ;
}
cout << endl ;
}
修改完善简化的代码如下,供参考:
#include <iostream>
using namespace std;
typedef int Status;
//链式多项式的创建
typedef struct PNode
{
float coef;
int expn;
struct PNode* next;
}PNode, * Polynomial;
//创建多项式
void CreatePolyn(Polynomial& P, int n)
{
int i;
P = new PNode;
P->next = NULL;
cout << "请分别输入多项式的系数和指数!" << endl;
for (i = 1; i <= n; ++i)
{
Polynomial s = new PNode;
cin >> s->coef >> s->expn;
Polynomial pre = P;
Polynomial q = P->next;
while (q && q->expn < s->expn)
{
pre = q;
q = q->next;
}
s->next = q;
pre->next = s;
}
}
//多项式的相加、减 ,flag值为 0 做加法,flag值为 1 做减法
void Add_Cut_Polyn(Polynomial Pa, Polynomial Pb, int flag = 0)
{
if ((!Pa || !Pa->next) && (!Pb || !Pb->next)) return;
Polynomial p1 = Pa->next, p2 = Pb->next;
Polynomial p3 = new PNode, pt3 = p3, p = NULL;
p3->next = NULL;
while (p1 && p2)
{
float sum = 0;
if (p1->expn == p2->expn){
sum = flag ? p1->coef - p2->coef : p1->coef + p2->coef;
if (sum != 0){
p = new PNode;
p->next = NULL;
p->coef = sum;
p->expn = p1->expn;
pt3->next = p;
pt3 = p;
}
p1 = p1->next;
p2 = p2->next;
}
else {
p = new PNode;
p->next = NULL;
if (p1->expn < p2->expn) {
p->coef = p1->coef;
p->expn = p1->expn;
p1 = p1->next;
}
else{
p->coef = p2->coef;
p->expn = p2->expn;
p2 = p2->next;
}
pt3->next = p;
pt3 = p;
}
}
p1 = p1 ? p1 : p2;
while (p1) {
p = new PNode;
p->next = NULL;
p->coef = p1->coef;
p->expn = p1->expn;
pt3->next = p;
pt3 = p;
p1 = p1->next;
}
pt3 = p3;
p = p3->next;
while (p){
cout << p->coef << "x^" << p->expn;
if (p->next && p->next->coef > 0)
cout << "+";
delete pt3;
pt3 = p;
p = p->next;
}
delete pt3;
cout << endl;
}
int main()
{
int a, b = 1;
//Polynomial(P);
Polynomial Pa = NULL;
Polynomial Pb = NULL;
cout << "请选择你要进行的操作: " << endl;
while (b)
{
cout << "--------------------------------------------------------------------------" << endl;
cout << "1.创建多项式 2.多项式相加 3.多项式相减 4.退出操作" << endl;
cin >> a;
switch (a)
{
int n, m;
case(1): cout << "请输入Pa的项数: " << endl; cin >> n;
CreatePolyn(Pa, n);
cout << "请输入Pb的项数: " << endl; cin >> m;
CreatePolyn(Pb, m); break;
case(2): Add_Cut_Polyn(Pa, Pb, 0); break;
case(3): Add_Cut_Polyn(Pa, Pb, 1); break;
case(4): exit(0);
default: printf("输入有误!请重新输入!");
}
}
return 0;
}
经过一次计算后,多项式链表的指针指向了最后一个节点,因此再次调用计算函数时,由于链表的头节点没有改变,导致无法正确遍历链表。解决方法是在每次计算之前,将链表的指针重新指向头节点,使其能够再次正确遍历链表。具体修改如下:
在AddPolyn()和Cutpolyn()函数中,在开始部分添加以下代码
Pa = Pa->next;
Pb = Pb->next;
void DisplayBoard(char borad[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", borad[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}