用单循环链表实现多项式乘法,编译出现问题

ReHall 2008-04-16 10:12:47
下面是我写的代码,通过编译,有5个错误,我调试了很久,还是未成功,哪位大虾帮下忙啊
#include<iostream>

using namespace std;

class Term{
public:
Term(int c,int e);
Term(int c,int e, Term* nxt);
Term* InsertAfter(int c,int e);
~Term();

private:
int coef;
int exp;
Term *link;
friend ostream &operator<<(ostream &,const Term &);
friend class Polynominal;
};

Term::Term(int c, int e):coef(c),exp(e){link=0;};
Term::Term(int c, int e, Term *nxt):coef(c),exp(e){link=nxt;};
Term::~Term(){

};
Term* Term::InsertAfter(int c, int e)
{
link=new Term(c,e,link);
return link;
};


ostream &operator<<(ostream & out,const Term& val)
{
if(val.coef==0) return out;
out<<val.coef;
switch(val.coef){
case 0:break;
case 1:out<<"X";break;
default:out<<"X^"<<val.exp;break;
}
return out;
};

class Polynominal
{
public:
Polynominal();
~Polynominal();
void AddTerms(istream& in);
void Output(ostream& out)const;
Polynominal Poly_add(Polynominal& pc,int coef,int exp);
Polynominal PolyMultiply(Polynominal& r);
private:
Term* theList;
friend ostream & operator<<(ostream &,const Polynominal &);
friend istream & operator<<(istream &,Polynominal &);
friend Polynominal operator*(Polynominal &,Polynominal &);
};

Polynominal::Polynominal()
{
theList=new Term(0,-1);
theList->link=theList;
};

Polynominal::~Polynominal()
{Term* p=theList->link;
while(p!=theList){
theList->link=p->link;
delete p;
p=theList->link;
}
delete theList;
} ;

void Polynominal::AddTerms(istream &in)
{
Term* q=theList;
int c,e;
for(;;){
cout<<"Input a term(coef,exp):\n"<<endl;
in>>c>>e;
if(e<0)break;
q=q->InsertAfter(c,e);
}
};

void Polynominal::Output(ostream &out) const
{
int first=1;
Term *p=theList->link;
cout<<"The Polynominal is:\n"<<endl;
for(;p!=theList;p=p->link){
if(!first &&(p->coef>0)) out<<"+";
first=0;
out<<*p;
}
cout<<"\n"<<endl;
};

Polynominal Polynominal::Poly_add(Polynominal& pc, int coef, int exp){
Term *p=theList->link;
Term *temp=theList ; ;
Term *p1,*p2;
while(p->exp>=0){
if(p->exp<exp){
temp=temp->InsertAfter(coef,exp);
p=p->link;
}
else if(p->exp==exp){
p->coef+=coef;
if(p->coef==0){
p1=p;
temp->link=p->link;
p=p->link;
delete p1;
}else{temp=p;p=p->link;}
return pc;
}
else{p2=temp->link;p2->coef=coef;p2->exp=exp;p=p2->link;return pc;}

}

};

Polynominal Polynominal::PolyMultiply(Polynominal& r)
{
int coef,exp;
Polynominal *pz=new Polynominal();

Term *a=theList->link;
Term *b=r.theList->link;
for(;a!=theList;a=a->link){
for(;b!=theList;b=b->link){
coef=(a->coef)*(b->coef);
exp=a->exp+b->exp;
pz=Poly_add(&pz,coef,exp);
}
}
return *pz;
};

ostream& operator<<(ostream & out,const Polynominal &x)
{x.Output(out);return out;
} ;
istream& operator >>(istream& in,Polynominal &x)
{x.AddTerms(in);return in;
} ;

Polynominal& operator*(Polynominal &a,Polynominal &b)
{
Polynominal z=a.PolyMultiply(b);
return z;
};

void main()
{
Polynominal p,q,z;
cin>>p;cout<<p;
cin>>q;cout<<q;
z=p*q;cout<<z;
};

下面是调试错误:
------ 已启动生成: 项目: termMU, 配置: Debug Win32 ------
正在编译...
termMU.cpp
d:\studio code\termmu\termmu\termmu.cpp(138) : error C2664: “Polynominal::Poly_add”: 不能将参数 1 从“Polynominal **__w64 ”转换为“Polynominal &”
d:\studio code\termmu\termmu\termmu.cpp(152) : error C2556: “Polynominal &operator *(Polynominal &,Polynominal &)”: 重载函数与“Polynominal operator *(Polynominal &,Polynominal &)”只是在返回类型上不同
d:\studio code\termmu\termmu\termmu.cpp(58) : 参见“operator *”的声明
d:\studio code\termmu\termmu\termmu.cpp(152) : error C2040: “operator *”: “Polynominal &(Polynominal &,Polynominal &)”与“Polynominal (Polynominal &,Polynominal &)”的间接寻址级别不同
d:\studio code\termmu\termmu\termmu.cpp(162) : error C2264: “operator *”: 函数定义或声明中有错误;未调用函数
d:\studio code\termmu\termmu\termmu.cpp(162) : error C2088: “*”: 对于 class 非法
生成日志保存在“file://d:\studio code\termMU\termMU\Debug\BuildLog.htm”
termMU - 5 个错误,0 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========
...全文
427 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
守护_ 2011-04-05
  • 打赏
  • 举报
回复
国软V5
cd1991619 2011-04-05
  • 打赏
  • 举报
回复
国软发来致谢信!!!顺便鄙视陈刚!!!!
naruto2010sasuke 2011-04-05
  • 打赏
  • 举报
回复
只有陈刚才会布置这种作业,只有国软才会用这种教材
ReHall 2008-04-21
  • 打赏
  • 举报
回复
何以见得?
kathyflying 2008-04-21
  • 打赏
  • 举报
回复
呵呵 又是一个国软的吧~
effective_person 2008-04-18
  • 打赏
  • 举报
回复

#include "stdafx.h"
/*

老实说你的程序有很多很多的毛病,什么引用的误区,还有设计函数的调用,释放空间也存在问题。等等。
看你的程序我也头痛。
不过学习过程还是要自己慢慢积累的。
o(∩_∩)o...哈哈
*/

#include <iostream>
using namespace std;
class Term
{
public:
Term(int c,int e);
Term(int c,int e, Term* nxt);
Term* InsertAfter(int c,int e);
~Term();
private:
int coef;
int exp;
Term *link;
friend ostream &operator <<(ostream &,const Term &);
friend class Polynominal;
};
Term::Term(int c, int e):coef(c),exp(e){link=0;};
Term::Term(int c, int e, Term *nxt):coef(c),exp(e){link=nxt;};
Term::~Term(){ };
Term* Term::InsertAfter(int c, int e)
{
link=new Term(c,e,link);
return link;
};
ostream &operator <<(ostream & out,const Term& val)
{
if(val.coef==0) return out;
out<<val.coef;
switch(val.coef)
{
case 0:
break;
case 1:
out <<"X";break;
default:
out <<"X^" <<val.exp;break;
}
return out;
};
class Polynominal
{
public:
Polynominal();
~Polynominal();
void AddTerms(istream& in);
void Output(ostream& out)const;
Polynominal& Poly_add(Polynominal& pc,int coef,int exp);
Polynominal PolyMultiply(Polynominal& r);
private:
Term* theList;
friend ostream & operator <<(ostream &,const Polynominal &);
friend istream & operator <<(istream &,Polynominal &);
friend Polynominal operator*(Polynominal &,Polynominal &);
};
Polynominal::Polynominal()
{
theList=new Term(0,-1);
theList->link=theList;
};

Polynominal::~Polynominal()
{
Term* p=theList; //释放空间好好看看数据结构的书上怎么说的。再看看和你的程序有什么程序有什么不同。
//为什么你的会错
while(p!=theList)
{
Term *q=p->link;
delete p;
p=q;
}
} ;

void Polynominal::AddTerms(istream &in)
{
Term* q=theList;
int c,e;
for(;;)
{
cout <<"输入系数,和指数(以<0结束):" <<endl;
in>>c>>e;
if(e <0)
break;
q=q->InsertAfter(c,e);
}
};

void Polynominal::Output(ostream &out) const
{
int first=1;
Term *p=theList->link;
cout <<"The Polynominal is:\n" <<endl;
for(;p!=theList;p=p->link)
{
if(!first &&(p->coef>0))
out <<"+";
first=0;
out <<*p;
}
cout <<"\n" <<endl;
};

Polynominal& Polynominal::Poly_add(Polynominal& pc, int coef, int exp)
{ //我现在没有完全弄懂你这个函数是怎么设计的。还有些逻辑的错误!自己弄弄吧!
Term *p=pc.theList->link;
Term *temp=pc.theList ; ;
Term *p1,*p2;
while(temp->exp>=-1)
{
if(p->exp <exp) //如果没有返回值会怎么样啊?
{
temp=temp->InsertAfter(coef,exp);
p=p->link;
}
else if(p->exp==exp)
{
p->coef+=coef;
if(p->coef==0) /
{
p1=p;
temp->link=p->link;
p=p->link;
delete p1;
}
else
{
temp=p;
p=p->link;
}
return pc;
}
else
{
p2=temp->link;
p2->coef=coef;
p2->exp=exp;
p=p2->link;
return pc;
}

}
return pc;//总体没有返回值,有些情况没有返回值

};

Polynominal Polynominal::PolyMultiply(Polynominal& r) //你的程序有一个很大的毛病。
//返回一个局部变量的引用 引用了一个已经释放掉的变量。就会报错。对你的程序看看
{
int coef,exp;
Polynominal pz;
// Polynominal *pz=new Polynominal();
Term *a=theList->link;
// Term *b=r.theList->link;
for(;a!=theList;a=a->link)
{
Term *b=r.theList->link;
for(;b!=r.theList;b=b->link)
{
coef=(a->coef)*(b->coef);
exp=a->exp+b->exp;
Poly_add(pz,coef,exp);
}
}
return pz;
};

ostream& operator <<(ostream & out,const Polynominal &x)
{
x.Output(out);
return out;
} ;
istream& operator >>(istream& in,Polynominal &x)
{
x.AddTerms(in);
return in;
} ;

Polynominal operator*(Polynominal &a,Polynominal &b)
{
// Polynominal z=a.PolyMultiply(b);
return a.PolyMultiply(b);
};

void main()
{
Polynominal p,q,z;
cout<<"输入第一个多项式:"<<endl;
cin>>p;
cout <<p;
cin>>q;
cout <<q;
z=p*q;
cout <<z;
};




ReHall 2008-04-18
  • 打赏
  • 举报
回复
非常感谢你的帮助!我都无法用语言表达了!
哎,看来我的技术水平不堪一提啊,有待提高!
ReHall 2008-04-18
  • 打赏
  • 举报
回复
谢谢!那个地方是我疏漏了!改friend Polynominal& operator*(Polynominal &,Polynominal &);之后,还有另外几处;
编译成功,但却不能输出z,也就是相乘的结果!是不是Polynominal::Poly_add(Polynominal& pc, int coef, int exp),还有Polynominal Polynominal::PolyMultiply(Polynominal& r) 函数有问题呢?我实在是头大了!
effective_person 2008-04-18
  • 打赏
  • 举报
回复

//修改了上述代码的2处提高安全性。

const Term* GetHead()const{return Headpoint;}

void Mutiply( const Polynominal& rf1, const Polynominal& rf2,Polynominal& z)
//考虑用函数,便于传递参数。
//采用引用,避免了大量的拷贝,其实也是提高效率。
{
const Term *q=rf1.GetHead();
q=q->link;
while(q!=NULL)
{
const Term*p=rf2.GetHead();
p=p->link;
while(p!=NULL)
{
z.Insert((*p)+(*q));
p=p->link;
}
q=q->link;
}
}

effective_person 2008-04-18
  • 打赏
  • 举报
回复

/*
我帮你的代码优化了一下。代码以准确,简单,效率为主
我今天的空余时间全被lz给占用了。

*/
#include "stdafx.h"
#include <iostream>
using namespace std;
namespace Poly
{
//采用命名空间实现封装数据
class Term
{
public:
Term(int c,int e):coef(c),exp(e),link(NULL){}
Term(){}
int coef;
int exp;
Term *link;
friend Term operator +( const Term& one,const Term& two);

};
Term operator +(const Term & rfone,const Term& rftwo)
{
return Term(rfone.coef*rftwo.coef,rfone.exp+rftwo.exp);
}
//多项式类
class Polynominal
{
public:
Polynominal();
~Polynominal();
void Insert(const Term& x);
friend ostream& operator <<(ostream& os,const Polynominal& rf) ;
friend istream& operator >>(istream& is,Polynominal & rf) ;
Term* GetHead(){return Headpoint;}
private:
Term* Headpoint;
Term* rearpoint;
};
Polynominal::Polynominal()
{
Headpoint=new Term;
Headpoint->coef=0;
Headpoint->exp=0;
Headpoint->link=NULL;
rearpoint=Headpoint;
}
Polynominal::~Polynominal()
{
Term* p=Headpoint;
while(p!=NULL)
{
Term *q=p->link;
delete p;
p=q;
}
}
void Polynominal::Insert(const Term& x)
{
Term * newdata=new Term;
newdata->coef=x.coef;
newdata->exp=x.exp;
newdata->link=NULL;
rearpoint->link=newdata;
rearpoint=newdata;
}
istream& operator >>(istream & is, Polynominal & rf)
{
int coef,exp;
cout<<"以系数0 为零为结束条件"<<endl;
cout<<"系数:";
cin>>coef;
cout<<"指数:";
cin>>exp;
while(coef!=0)
{
Term *newdata=new Term;
newdata->coef=coef;
newdata->exp=exp;
newdata->link=NULL;
rf.rearpoint->link=newdata;
rf.rearpoint=newdata;
cout<<"以系数0 为零为结束条件"<<endl;
cout<<"系数:";
is>>coef;
cout<<"指数:";
is>>exp;
}
return is;
}
ostream& operator << (ostream& os,const Polynominal& rf)
{
Term *p=rf.Headpoint->link;
while(p!=NULL)
{
os<<p->coef<<"X^"<<p->exp<<"+";
p=p->link;
}
return os;
}

void Mutiply( Polynominal& rf1, Polynominal& rf2,Polynominal& z)//考虑用函数,便于传递参数。
//采用引用,避免了大量的拷贝,其实也是提高效率。
{
Term *q=rf1.GetHead();
q=q->link;
while(q!=NULL)
{
Term*p=rf2.GetHead();
p=p->link;
while(p!=NULL)
{
z.Insert((*p)+(*q));
p=p->link;
}
q=q->link;
}
}

}
void main()
{
using namespace Poly;
Polynominal p,q,z;
cin>>p;
cout<<p<<endl;
cin>>q;
cout<<q<<endl;
Mutiply(p,q,z);//关键在于此,你的程序声明了太多变量了。需要很长时间赋值 ,构造。实现优化。
//还避免了,局部变量的应用问题。
cout<<endl;
cout<<"p*q=";
cout<<z<<endl;
};

ReHall 2008-04-18
  • 打赏
  • 举报
回复
是啊,对指针,还有引用等等我还是一塌糊涂!c++编程也不是很在行!
设计是将两个按降幂多项式p,q相乘,得到的结果保存在在z中;
程序里,那个Polynominal& Polynominal::Poly_add(Polynominal& pc, int coef, int exp)函数,我是想将一个节点(coef,exp)添加到多项式pc中,(两个多项式相乘,先是节点相乘,得到的节点就加到pc中,我是这样想的,将pc的节点遍历,如果与(coef,exp)指数相等,就将节点的系数相加,如果小于的话,就插在(coef,exp)之后。如果是你,会怎样编写呢?
effective_person 2008-04-16
  • 打赏
  • 举报
回复

Polynominal& operator*(Polynominal &a,Polynominal &b)
{
...
}

friend Polynominal operator*(Polynominal &,Polynominal &); //不一致 返回&还值啊?



64,687

社区成员

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

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