请诸位帮我看看下面的程序为什么不能将两个多项式合并:
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
float coef;
int expn;
struct LNode *next;
}Lnode,*LinkList;
LinkList CreatePoly(LinkList L,float ccoef,int eexpn);
LinkList MergePoly(LinkList La,LinkList Lb);
LinkList Insert(LinkList La,LinkList Pb);
void Output(LinkList L);
int main(void)
{
LinkList La=NULL,Lb=NULL;
Lnode P;
int i,n;
printf("Please input La length: ");
scanf("%d",&n); //代表多项式项数
for(i=1;i<=n;i++) //创建多项式La
{
scanf("%f",&P.coef);
scanf("%d",&P.expn);
La=CreatePoly(La,P.coef,P.expn);
Output(La); //输出多项式
}
printf("Please input Lb length: ");
scanf("%d",&n);
for(i=1;i<=n;i++) //创建多项式Lb
{
scanf("%f",&P.coef);
scanf("%d",&P.expn);
Lb=CreatePoly(Lb,P.coef,P.expn);
Output(Lb);
}
La=MergePoly(La,Lb); //合并两个多项式
Output(La);
return 0;
}
LinkList CreatePoly(LinkList L,float ccoef,int eexpn) //创建多项式函数
{
LinkList newPtr,previousPtr,currentPtr;
if((newPtr=(LinkList)malloc(sizeof(Lnode)))==NULL) //动态内存分配
{
exit(1);
}
newPtr->coef=ccoef;
newPtr->expn=eexpn;
newPtr->next=NULL;
previousPtr=NULL;
currentPtr=L;
while(currentPtr && currentPtr->expn > newPtr->expn) //按指数有大到小排序
{
previousPtr=currentPtr;
currentPtr=currentPtr->next;
}
if(!previousPtr) //多项式链表为空时
{
newPtr->next=L;
L=newPtr;
}
else
{
previousPtr->next=newPtr;
newPtr->next=currentPtr;
}
return L;
}
LinkList MergePoly(LinkList La,LinkList Lb) //合并两个多项式
{
LinkList Pb,temp;
if(!La) //多项式La为空时
return Lb;
else if(!Lb) //多项式Lb为空时
return La;
else
{
Pb=Lb; //Pb指向多项式第一项
while(Pb) //依次取Lb中的项插入到La中
{
La=Insert(La,Pb);
Pb=Pb->next;
}
}
while(Lb) //释放多项式Lb的内存
{
temp=Lb;
Lb=Lb->next;
free(temp);
}
return La;
}
LinkList Insert(LinkList La,LinkList Pb)
{
LinkList previousPtr,currentPtr;
previousPtr=NULL;
currentPtr=La;
while(currentPtr && currentPtr->expn > Pb->expn)
{
previousPtr=currentPtr;
currentPtr=currentPtr->next;
}
if(currentPtr->expn==Pb->expn) //指数相同情况下
{
currentPtr->coef+=Pb->coef;
}
else //指数不相同情况下
{
previousPtr->next=Pb;
Pb->next=currentPtr;
}
return La;
}
void Output(LinkList L)
{
while(L)
{
printf("%.0fx(%d)->",L->coef,L->expn);
L=L->next;
}
printf("NULL\n");
}