请教高人,关于用连表进行多项式加减
//按照指数降序排列建立并输出多项式,完成相加相减。
//我运行了好象输入输出都没问题,加法也没问题,减法就不对了。请教高人,谢谢
#include "iostream.h "
#include <iomanip>
using namespace std;
typedef struct node //链表结构体
{
int coef; //系数
int exp; //次数
struct node *next;
}Node;
Node *poly_create(); //创建多项式
void poly_show(Node *LA); //显示多项式
Node *poly_add(Node *LA,Node *LB);//多项式A+B
Node *poly_sub(Node *LA,Node *LB);//多项式A-B
int main()
{
Node *LA,*LB,*LC,*LD;
printf( "建立一个多项式A!\n "); //创建A
LA=poly_create();
printf( "建立一个多项式B!\n "); //创建B
LB=poly_create();
printf( "A: "); //显示A
poly_show(LA);
printf( "B: "); //显示B
poly_show(LB);
printf( "A+B: "); //A+B
LC=poly_add(LA,LB);
poly_show(LC);
printf( "A-B: "); //A-B
LD=poly_sub(LA,LB);
poly_show(LD);
return 0;
}
Node *poly_create() //创建多项式
{
Node *LA,*pa;
LA=(Node *)malloc(sizeof(Node)); //初始化头节点
LA-> next=(Node *)malloc(sizeof(Node)); //生成次节点
pa=LA-> next; //pa指向次节点
printf( "请输入多项式的项数: ");
int n;scanf( "%d ",&n);
for(int i=1;i <n;i++) //逐项输入多项式的n-1项
{
printf( "请输入第%d项系数: ",i);
scanf( "%d ",&pa-> coef);
printf( "指数: ");
scanf( "%d ",&pa-> exp);
pa-> next=(Node*)malloc(sizeof(Node));
pa=pa-> next;
}
printf( "请输入第%d项系数: ",i); //输入第n项
scanf( "%d ",&pa-> coef);
printf( "指数: ");
scanf( "%d ",&pa-> exp);
pa-> next=NULL; //最后节点的next指向空
return LA;
}
void poly_show(Node *LA) //显示多项式,+号可能冗余:)
{
Node *pa;
pa=LA-> next;
for(;pa!=NULL;pa=pa-> next)
printf( "+%d*x^%d ",pa-> coef,pa-> exp);
printf( "\n ");
}
Node *poly_add(Node *LA,Node *LB) //LA+LB
{
Node *pa,*pb,*pc,*LC; //LC为和链表,pc指向其节点
LC=LA;pc=LC;
pa=LA-> next;
pb=LB-> next;
while(pa!=NULL&&pb!=NULL) //LA,LB都不空时根据次数将被加项连接进和式中
{
if(pa-> exp==pb-> exp) //待比较的节点次数相等时
{pa-> coef=(pa-> coef)+(pb-> coef);
pc-> next=pa;pc=pc-> next;pa=pa-> next;pb=pb-> next;}
else if((pa-> exp)> (pb-> exp)) //LA次数高于LB时
{pc-> next=pa;pc=pc-> next;pa=pa-> next;}
else //LA次数低于LB时
{pc-> next=pb;pc=pc-> next;pb=pb-> next;}
}
if(pa!=NULL) //如果LB加完了
pc-> next=pa;
if(pb!=NULL) //如果LA加完了
pc-> next=pb;
return LC;
}
Node *poly_sub(Node *LA,Node *LB)//LA-LB
{
Node *LC,*p; //思路是先将LB系数全部取负后调用LA+LB
p=LB-> next;
while(p!=NULL)
{
p-> coef=p-> coef*(-1);
p=p-> next;
}
//poly_show(LB); //此式可以看出LB的系数已经全部被取反
LC=poly_add(LA,LB); //为何LA+(-LB)不等于LA-LB?
return LC;
}
//Node *poly_sub(Node *LA,Node *LB)
//{
//Node *pa,*pb,*pc,*LC;
// LC=LA;pc=LC;
//pa=LA-> next;
//pb=LB-> next;
// while(pa!=NULL&&pb!=NULL)
//{
//if(pa-> exp==pb-> exp)
//{
//pa-> coef=(pa-> coef)-(pb-> coef);
//pc-> next=pa;pc=pc-> next;pa=pa-> next;pb=pb-> next;
//}
//else
//{
//if(pa-> exp> pb-> exp)
//{
//pc-> next=pa;pc=pc-> next;pa=pa-> next;
//}
//else
//{
//pb-> coef=pb-> coef*(-1);
//pc-> next=pb;pc=pc-> next;pb=pb-> next;
//}
//}
//}
//if(pa!=NULL)
//pc-> next=pa;
//if(pb!=NULL)
//{
//Node *p=pb;
//do
//{
//pb-> coef=-1*pb-> coef;
//pb=pb-> next;
//}
//while(pb==NULL);
//pc-> next=p;
//}
//return LC;
//}
[解决办法]
我觉得你的问题在这:
LC=poly_add(LA,LB);
poly_show(LC);
这句执行之后,B已经被修改了,也就是不是你原来输入的那个B了,它的很多项已经被连到了A里面
并用LC来接收,现在LC是A和B相加的结果,输出当然是正确的.
printf( "A-B: "); //A-B
LD=poly_sub(LA,LB);
poly_show(LD);
现在再进行A-B的操作,A和B已经不是原来的A和B
[解决办法]
up