2 qq 34982491 qq_34982491 于 2016.09.18 21:38 提问

c++中析构函数出现问题

#pragma once
#include
using namespace std;
struct term
{
double coef;//{数} coefficient 系数
int expn;//exponent 指数

};
struct PNode
{
term data;
PNode *next;
};
class Polyn //polynomial 多项式
{
public:
Polyn()
{
cout << "构造函数调用"< phead = new PNode;
phead->next = NULL;
}
~Polyn() { cout << "析构函数调用"<<endl; clear(); delete phead; }//野指针????存在-出错
void clear(); //清空
void creatp();//建立链表
Polyn PolyAdd(Polyn pb);//多项式求和

void print();//输出
private:
PNode *phead;

};

void Polyn::clear()
{
PNode *p, *q;
p = phead->next;
while (p)
{

    q = p->next;
    delete p;
    p = q;

}
phead->next = NULL;

}
void Polyn::creatp()
{
int n;
int i = 0;
cout << "请输入多项式项数:";
cin >> n;
PNode *p, *q;
q = phead;
for (i = 0; i < n; i++)
{
p = new PNode;
//cout << "输入系数:" << endl;
cin >> p->data.coef;
//cout << "输入指数:"< cin >> p->data.expn;
p->next = NULL;
q->next = p;
q = p;
}
}
Polyn Polyn::PolyAdd(Polyn pb)
{
Polyn pc;
PNode *p1, *p2, *p3;
p1 = phead;
p2 = pb.phead;
p3 = pc.phead;
PNode *t1, *t2, *t3;
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;
}
else if (t1->data.expn > t2->data.expn)
{
t3->next = new PNode;
t3 = t3->next;
t3->data = t2->data;
t2 = t2->next;
}
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;
}
}
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::print()
{
PNode *p;
p = phead->next;
if (phead->next == NULL)
cout << "empty!!" << endl;
else
while (p)
{
cout << p->data.coef << " " << p->data.expn << " ";
p = p->next;
}
cout << endl;
}

main.cpp
#include
#include"polynomial.h"
using namespace std;
int main()
{
Polyn s,s2;
cout << "输入多项式1:" << endl;
s.creatp();
cout << "输入多项式2:" << endl;
s2.creatp();
s2.print();

cout << "相加为:" << endl; s.PolyAdd(s2).print();
//s3.print();
/*s3.clear();//error 出错,完全相同可运行
s2.clear();
s.clear();
/*s.creatp();
s.print();*/

}
//realloc
以上是代码运行到相加时会停止,求大神解答

1个回答

devmiao
devmiao   Ds   Rxr 2016.09.19 00:13
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
【C/C++】构造函数和析构函数
构造函数和析构函数
C语言的构造函数与析构函数
__attribute__((constructor))  与 __attribute__((destructor)) #include void _init(void)__attribute__((constructor)); void _fini(void)__attribute__((destructor)); void _init(void) { printf("c
关于析构函数出错
#include #include #include using namespace std; class A { private: char *name; public: A(char *n) { name=new char[strlen(n)+1]; strcpy(name,n); cout<<name<<endl; }; A(const A &a){ cout<
C++:类的构造函数和析构函数
C++:类的构造函数和析构函数标签(空格分隔): c++ 作者:陈小默C类的构造函数和析构函数 构造函数 声明和定义 引用参数与构造函数 使用构造函数定义对象 默认构造函数 析构函数 声明和定义 析构函数的执行时机 const成员函数 实例演示 开发环境:Visual Studio 2010 构造函数当我们需要在对象创建时初始化一些数据的时候,我们不可能提供一个普通的成员方法供程序猿在对象创建后调
析构函数的调用顺序
析构函数做最后的“清场工作”, 一般当派生类对象从内存中撤销时,先调用派生类的析构函数,再调用基类析构函数; 但,若用new建立了临时对象,在用delete撤销对象是,系统会只执行基类的析构函数,而不执行派生类的析构函数。 如果将基类的析构函数声明为虚函数,由基类所有派生类的析构函数自动成为虚函数(即使析构函数名不同)。 将析构函数加上vitual,实现具体对象的 动态关联
c++构造函数和析构函数的区别?
构造函数: 什么是构造函数?通俗的讲,在类中,函数名和类名相同的函数称为构造函数。它的作用是在建立一个对象时,作某些初始化的工作(例如对数据赋予初值)。C++允许同名函数,也就允许在一个类中有多个构造函数。如果一个都没有,编译器将为该类产生一个默认的构造函数。 构造函数上惟一的语法限制是它不能指定返回类型,甚至void 也不行。 不带参数的构造函数:一般形式为 类名 对象名(){函数体}
C++类的构造函数与析构函数
C++中每个类都有其构造与析构函数,它们负责对象的创建和对象的清理和回收,即使我们不写这两个,编译器也会默认为我们提供这些构造函数。下面仍然是通过反汇编的方式来说明C++中构造和析构函数是如何工作的。编译器是否真的会默认提供构造与析构函数在一般讲解C++的书籍中都会提及到当我们不为类提供任何构造与析构函数时编译器会默认提供这样六种成员函数:不带参构造,拷贝构造,“=”的重载函数,析构函数,以及带co
Objective-C学习笔记---构造函数和析构函数
简单的讲,构造函数就是在创建一个对象的时候起到初始化的作用,对这个对象里的一些成员变量进行初始化,析构函数就是在对象被删除进行一些清理工作,也就是专门的扫尾工作,下面用代码来进行具体说明。   一、构造函数   在OC中凡是已init开头的函数我们都称之为构造函数,在声明构造函数的时候,不带参数的一般直接声明为“-(id)init”,带参数的一般声明为“-(id)initWith
c++析构函数的调用
// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include using namespace std; class haitao{ private: int ageee; public : int getAgee(){ return ageee; } h
c语言中构造函数和析构函数抛出异常
C++中构造函数和析构函数可以抛出异常吗? 都不行 都可以 只有构造函数可以 只有析构函数可以 答案是C          1.不建议在构造函数中抛出异常;        2.构造函数抛出异常时,析构函数将不会被执行,需要手动的去释放内存         1.析构函数不应该抛出异常;        2.当析构函数中会有一些可能发