为什么我这个程序一加构造体constructor就报错?一去掉就好了?

tommyxdf 2009-03-01 06:30:16
头文件:
#ifndef POLYNOMIAL_H
#define POLYNOMIAL_H

#include <iostream>
using std::ostream;
using std::istream;

class Polynomial
{


private:
struct NumberElement
{
int coefficient;
int exponent;
struct NumberElement *next;
};
NumberElement *head;

public:
Polynomial()
{
head = NULL;
}
Polynomial(const Polynomial &);

const Polynomial &operator=( const Polynomial &);
Polynomial operator+(const Polynomial &);

void insertElement(int, int);
void display(ostream &) const;
};
ostream &operator<<( ostream &, const Polynomial &);

#endif


类文件:
// Member-function definitions for class Polynomial
#include <iostream>
using std::cerr;
using std::cout;
using std::cin;
using std::endl;

#include "Polynomial.h"

Polynomial::Polynomial(const Polynomial &polyCopy)
{
NumberElement *elementPtr;

elementPtr = polyCopy.head;
NumberElement *nm=new NumberElement;
head=nm;
NumberElement *np=polyCopy.head;
nm->coefficient=np->coefficient;
nm->exponent=np->exponent;
while(np->next!=0)
{
nm=nm->next; np=np->next;
nm=new NumberElement;
nm->coefficient=np->coefficient;
nm->exponent=np->exponent;
}
nm->next = NULL;
}

void Polynomial::insertElement(int a, int b)
{
NumberElement *newElement;
NumberElement *elementPtr;
NumberElement *previousElement = NULL;

newElement = new NumberElement;
newElement->coefficient = a;
newElement->exponent = b;

if(!head)
{
head = newElement;
newElement->next = NULL;
}

else
{
elementPtr = head;
previousElement = NULL;

while(elementPtr!=NULL&&newElement->exponent<elementPtr->exponent)
{
previousElement = elementPtr;
elementPtr = elementPtr->next;
}

if(previousElement==NULL)
{
head = newElement;
newElement->next = elementPtr;
}

else
{
if(elementPtr==NULL)
{
previousElement->next = newElement;
newElement->next = NULL;
}
else
{
previousElement->next = newElement;
newElement->next = elementPtr;
}
}

}

}

const Polynomial &Polynomial::operator=(const Polynomial &right)
{

NumberElement *p,*q, *r;
head = NULL;
if (!right.head)
return *this;
head = new NumberElement;
head->coefficient = right.head->coefficient;
head->exponent = right.head->exponent;
head->next = NULL;
r=NULL;
p=head;
q=right.head->next;
while(q!=NULL)
{
r = new NumberElement;
r->coefficient = q->coefficient;
r->exponent = q->exponent;
r->next = NULL;
p->next = r;
p = p->next;
q = q->next;
}
return *this;

}

Polynomial Polynomial::operator+(const Polynomial &polyAdd)
{
/*Polynomial temp;
temp.head = new NumberElement;
temp = polyAdd;
cout<<temp<<endl;
return temp;
*/
Polynomial temp;
NumberElement *p, *q;
p = this->head;
q = polyAdd.head;
int coefficient, exponent;

temp.head = new NumberElement;
if (p->exponent==q->exponent)
{
coefficient = p->coefficient + q->coefficient;
exponent = p->exponent;
temp.head->coefficient = coefficient;
temp.head->exponent = exponent;
temp.head->next = NULL;
p = p->next;
q = q->next;
}

while(p!=NULL&&q!=NULL)
{
if(p->exponent>q->exponent)
{
coefficient = p->coefficient;
exponent = p->exponent;
temp.insertElement(coefficient, exponent);
cout<<coefficient<<", "<<exponent<<" copied"<<endl;
p = p->next;
}

else if(p->exponent<q->exponent)
{
coefficient = p->coefficient;
exponent = q->exponent;
temp.insertElement(coefficient, exponent);
cout<<coefficient<<", "<<exponent<<" copied"<<endl;
q = q->next;
}

else
{
coefficient = p->coefficient + q->coefficient;
exponent = p->exponent;
temp.insertElement(coefficient, exponent);
cout<<coefficient<<", "<<exponent<<" copied"<<endl;
p = p->next;
q = q->next;
}
}

while (p!=NULL&&q==NULL)
{
coefficient = p->coefficient;
exponent = p->exponent;
temp.insertElement(coefficient, exponent);
cout<<coefficient<<", "<<exponent<<" copied"<<endl;
p = p->next;
}

while(q!=NULL&&p==NULL)
{
coefficient = q->coefficient;
exponent = q->exponent;
temp.insertElement(coefficient, exponent);
cout<<coefficient<<", "<<exponent<<" copied"<<endl;
q = q->next;
}

cout<<temp<<endl;


//Polynomial temp(polyAdd);

return temp;
}


void Polynomial::display(ostream &out) const
{
NumberElement *elementPtr = this->head;
while(elementPtr->next!=NULL)
{
//out<<"begin while"<<endl;
out << elementPtr->coefficient << "X^" << elementPtr->exponent << " + ";
elementPtr = elementPtr->next;
//out<<"end while"<<endl;
}

out << elementPtr->coefficient << "X^" << elementPtr->exponent <<endl;
}

ostream &operator<<(ostream &out, const Polynomial &poly)
{
poly.display(out);

return out;
}


运行文件:
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

#include "Polynomial.h"

int main()
{
Polynomial poly1, poly2, poly3;
int exp, coe;
cout<<"Please input"<<endl;
cin>>coe>>exp;
poly1.insertElement(coe,exp);

cout<<"input again"<<endl;
cin>>coe>>exp;
poly1.insertElement(coe,exp);

cout<<poly1<<endl;
poly2 = poly1;
cout<<poly2<<endl;
poly3 = poly1 + poly2;
cout<<poly3<<endl;
return 0;
}
...全文
134 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tommyxdf 2009-03-01
  • 打赏
  • 举报
回复
恩 谢谢1楼和5楼!
  • 打赏
  • 举报
回复
while(np->next!=0)
{
nm=nm->next; np=np->next;
nm=new NumberElement;
nm->coefficient=np->coefficient;
nm->exponent=np->exponent;
}
问题就是这里咯,1楼说的很清楚了。你往nm里插新元素,先执行nm=nm->next;这个时候nm->next为空,nm=new NumberElement; 都还没有分配新内存进来,完全没有达到效果。所以要先把nm->next元素处理好,再执行nm=nm->next;
whillcoxdennis 2009-03-01
  • 打赏
  • 举报
回复
mark~
tommyxdf 2009-03-01
  • 打赏
  • 举报
回复
谢谢2楼,问题解决了。
刚刚没看清楚你的带码,不好意思,真的很谢谢你。
但我还是不太清楚个中差异,望能解释一下。
tommyxdf 2009-03-01
  • 打赏
  • 举报
回复
还是不行啊
还有 我原来还有个destructor 情况是只要没有constructor和destructor,程序就没有什么问题。加上这两个里的任意一个就出现问题了,百思不得其解啊

destructor 如下:
Polynomial::~Polynomial()
{
NumberElement *elementPtr; // To traverse the list
NumberElement *nextElement; // To point to the next node

// Position nodePtr at the head of the list.
elementPtr = head;

// While nodePtr is not at the end of the list...
while (elementPtr != NULL)
{
// Save a pointer to the next node.
nextElement = elementPtr->next;

// Delete the current node.
delete elementPtr;

// Position nodePtr at the next node.
elementPtr = nextElement;
}
}
乔乔公爵 2009-03-01
  • 打赏
  • 举报
回复

Polynomial::Polynomial(const Polynomial &polyCopy)
{
NumberElement *elementPtr;

elementPtr = polyCopy.head;
NumberElement *nm=new NumberElement;
head=nm;
NumberElement *np=polyCopy.head;
nm->coefficient=np->coefficient;
nm->exponent=np->exponent;
while(np->next!=0)
{
//nm=new NumberElement;
nm->next = new NumberElement;
nm=nm->next; np=np->next;
nm->coefficient=np->coefficient;
nm->exponent=np->exponent;
}
nm->next = NULL;
}


问题出在这个函数的while里。
你原来是先做nm=nm->next,但这里不对。
要先给nm->next赋一个new的值,有了新值再nm 使用新值去做操作
楼主可以把构造函数替换为我的这个函数,再试运行一下。
乔乔公爵 2009-03-01
  • 打赏
  • 举报
回复
你可以多调试一下看看,要给nm->next赋值就要先进行new
你原来的程序就是nm->next的值不对。要先申请地址,然后再使用地址,同时把申请到新地址挂到next上

64,637

社区成员

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

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