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

C++一元多项式相加的结果输出有关问题

2012-11-12 
C++一元多项式相加的结果输出问题输出多项式系数出问题,输出不全,但是只输出指数就没问题;问题行已经标记

C++一元多项式相加的结果输出问题
输出多项式系数出问题,输出不全,但是只输出指数就没问题;
问题行已经标记了:
 cout<<p->data.coef<<" "<<p->data.expn<<" "<<endl;//就是这里的p->data.coef出问题了

代码如下:


#include <iostream>
using namespace std;

struct term
{
  double coef;//系数
  int expn;//指数
  };

struct PNode
{
  term data;
  PNode *next;
  };

class Polyn
{
  public:
  Polyn(){phead = new PNode;phead->next=NULL;}
  ~Polyn(){
  do{delete phead;
  phead=phead->next;
  }while(phead!=NULL);
  }
  void clear(){phead->next=NULL;}
  void creatp();
  Polyn PolyAdd(Polyn Pb);
  void Print();
  private:
  PNode *phead;
  };
   
Polyn Polyn::PolyAdd(Polyn Pb)  
{
  Polyn Pc;
  PNode *p1,*p2,*p3;
  p1=phead;
  p2=Pb.phead;
  p3=Pc.phead; 
  PNode *t1=p1->next,*t2=p2->next,*t3=p3;
  while(t1&&t2)
  {
  if(t1->data.expn<t2->data.expn)
  {
  t3->next=new PNode;
  t3=t3->next;
  t3->data=t1->data;
  t1=t1->next;
  cout<<1<<endl;
  }
  else if(t1->data.expn>t2->data.expn)
  {
  t3->next=new PNode;
  t3=t3->next;
  t3->data=t2->data;
  t2=t2->next;
  cout<<2<<endl;
  }  
  else{
  double a=t1->data.coef+t2->data.coef;
  if(a!=0.0)
  {
  t3->next=new PNode;
  t3=t3->next;
  t3->data.coef=a;
  t3->data.expn = t1->data.expn;
  }
  t1=t1->next;
  t2=t2->next; 
  cout<<3<<endl;
  }
  }
  while(t1!=NULL){
  t3->next=new PNode;
  t3=t3->next;
  t3->data=t1->data;
  t1=t1->next;
  }
  while(t2!=NULL){
  t3->next=new PNode;
  t3=t3->next;
  t3->data=t2->data;
  t2=t2->next;
  }
  t3->next=NULL;
  return Pc;
  }
void Polyn::creatp()
 {
  PNode *p,*q;
  int n;
  q=phead;
  cout<<"输入n"<<endl;
  cin>>n;
  cout<<"输入各项系数和指数:"<<endl;


  for(int i=0;i<n;++i)
  {
  p=new PNode;
  cin>>p->data.coef>>p->data.expn;
  p->next=NULL;
  q->next=p;
  q=p; 
   
  }
  }
 void Polyn::Print()
 {
  PNode * p;
  p=phead->next;
  while(p!=NULL)
  {
  cout<<p->data.coef<<" "<<p->data.expn<<" "<<endl;//就是这里出问题了[color=#FF0000][/color]
  p=p->next;
  cout<<4<<endl;
  }
  cout<<endl;
  }
int main()
{
  Polyn Pa,Pb,Pc;
  Pa.creatp();
  Pb.creatp();
  Pc=Pa.PolyAdd(Pb);
  Pc.Print();
  system("pause");
  return 0;
  }  
   


[解决办法]
~Polyn(){
do{delete phead;
phead=phead->next; // phead已经被delete了,不能在用phead->next了,这个是大bug
}while(phead!=NULL);
}

Polyn Polyn::PolyAdd(Polyn Pb)
{
...
}
所以
Pc=Pa.PolyAdd(Pb);
这条语句执行,进入Polyn::PolyAdd函数时:pb.head已经被释放了。
函数的返回值也有有释放head的操作,所以pc的head也是无效的。

你可以先尝试,先把析构函数注释掉,如果不出问题的话,就说明你add函数的逻辑是对的。
然后再查资料找类的析构函数、拷贝构造函数、赋值函数什么时候调用(特别是函数参数、返回值),然后去修改你polyn类。弄明白这几点非常重要。 可以去网上找个别人实现的简单string类,看看别人是怎么实现的。

热点排行