首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请问高人,关于用连表进行多项式加减

2012-02-07 
请教高人,关于用连表进行多项式加减//按照指数降序排列建立并输出多项式,完成相加相减。//我运行了好象输入

请教高人,关于用连表进行多项式加减
//按照指数降序排列建立并输出多项式,完成相加相减。
//我运行了好象输入输出都没问题,加法也没问题,减法就不对了。请教高人,谢谢
#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

热点排行