有空来坐坐,请教个C++问题
我的想法:-->首先说下下边程序的功能:主要是进行多项式的同类项的合并。我的方法是先对多项式的指数从大到小的顺序排一次(这步我已经做了),然后比较相邻的结点中的指数,如果相等的话,就把后结点中的系数加到前点的系数,并且把后结点删除。然后前结点和后结点同时向后移,当历遍一次后,同类项的就合并了。我想请教的问题:-->下边程序(编译没问题),运行过程中有错误,以致被终止了,我简单的调试下,发现是listdeal这个函数有问题,但我找了好久都找不出,所以请高手帮看一下,是错在哪里了?帮改一下,先谢过了。
#include<iostream.h>
#include<cstdio>
struct Node //这个是结构体,conf是用来存每项的系数,exps是用来存每项的指数
{
float conf;
int exps;
Node *next;
Node()
{
conf=0.0;
exps=0;
next=NULL;
}
};
void printA(Node *pp) //这个函数的功能是打出多项式,pp表示链表的头指针
{
cout<<"多项式为:";
cout<<pp->conf<<"x"<<char(94)<<pp->exps;
pp=pp->next;
while(pp)
{
if(pp->conf!=0)
{
if(pp->conf>0)
{
cout<<" + "<<pp->conf;
if(pp->exps!=0)
cout<<"x"<<char(94)<<pp->exps;
}
if(pp->conf<0)
{
cout<<" - "<<-pp->conf;
if(pp->exps!=0)
cout<<"x"<<char(94)<<pp->exps;
}
}
pp=pp->next;
}
cout<<endl;
}
Node *createNode() //这个函数的功能是创建一个链表,并反回该链表的指针
{
Node *str,*p;
float c;
int e;
p=new Node;
str=p;
cin>>c>>e;
p->conf=c;
p->exps=e;
p->next=NULL;
while(true)
{
Node *temp=new Node; //多项式的输入格式,比如多项式:2x^3+5x^2
cin>>c>>e; // 2 3 (回车)
temp->conf=c; // 5 2 (回车)
temp->exps=e; // 0 0 (回车)
temp->next=NULL;
p->next=temp;
p=temp;
if(c==0.0&&e==0) //当系数和指数都为0时,该多项式结束,进入下一条多项式的输入(如如果有必要的话)
{
break;
}
}
return str;
}
Node *listdeal(Node *A) //这个函数是对多项式进行整理
{
Node *back,*follow,*temp=A; //也就是进行同类项的合并,只合并相邻的项,并且合并后删除后一个结点
back=A;
follow=back->next;
while(follow)
{
if(back->exps==follow->exps) //当前结点的系数和后结点的系数相等时
{
Node *tp;
tp=follow; //把后继结点保存,以便稍后要删除
back->conf+=follow->conf; //把后结点的系数加到前结点上
back->next=follow->next;
delete tp; //删除后继结点
}
back=back->next; //前结点和后结点都同时后移
follow=follow->next;
}
return temp;
}
void clears(Node *xp) //这个函数用来清空链表
{
Node *tp;
while(xp)
{
tp=xp;
xp=xp->next;
delete tp;
}
}
void main()
{
Node *t1,*t2;
t1=createNode();
t2=listdeal(t1);
printA(t2);
clears(t1);
clears(t2);
}