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

全球闻名1 2012-09-14 10:45:58
输出多项式系数出问题,输出不全,但是只输出指数就没问题;
问题行已经标记了:
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;//就是这里出问题了
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;
}

...全文
166 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
全球闻名1 2012-09-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
~Polyn(){
do{delete phead;
phead=phead->next; // phead已经被delete了,不能在用phead->next了,这个是大bug
}while(phead!=NULL);
}

Polyn Polyn::PolyAdd(Polyn Pb)
{
...
}
所以
Pc=Pa.PolyAdd(Pb);
这条语句执……
[/Quote]

嗯嗯,注释掉就对了,我再看看析构函数。。
npuhuxl 2012-09-15
  • 打赏
  • 举报
回复
~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类,看看别人是怎么实现的。
全球闻名1 2012-09-14
  • 打赏
  • 举报
回复
coef是系数
expn是指数

出错的是p->data.coef;如果我只输出p->data.expn 就没问题

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧