具有两个结构的多项式链表及其问题

时间:2011-04-07 00:12:15

标签: c++

#include <iostream>
using namespace std;
struct Term;
struct Node;

typedef Term* termPtr;
typedef Node* list;

list cons(int degree,int coeff, list p);

struct Term
{
    int degree;
    int coeff;
};

struct Node
{
    termPtr term;
    list link;
};
class polynomial
{
private:
    list poly;
static const int VARIABLE_X='X';
char variable;
public:
    polynomial():poly(NULL),variable(VARIABLE_X){};
    polynomial(int coef,int deg);
    polynomial insert (termPtr t,list p);
    int degree() const;
    int coeff(int n) const;
    void setPrintVariable (char x){variable=x;}
    char getPrintVariable()const { return variable;}
    friend const polynomial readPoly();
    friend void printPoly(polynomial a);
    void deletePoly();
    friend const polynomial operator +(const polynomial &a,const polynomial &b);
    friend const polynomial operator *(const polynomial &a,const polynomial &b);
 };

 polynomial::polynomial(int c,int d)
 {
if(poly == NULL)//compiler doesnt understand this part
    poly = cons(c,d,poly);
    else // i put my cons here just to make the poly
            poly=cons(c,d,poly);

}
list cons(int c,int d, list p)
{
    termPtr aterm = new Term;
    aterm->coeff=c;
    aterm->degree=d;
    list q = new Node;
    q->term = aterm;
    q->link = p;
    return q;
} 

void printPoly (polynomial a)
{
cout<<"[";
if(a.poly == NULL)
    cout<<"]";
else
    while(a.poly != NULL)
    {
        cout<<"("<<a.poly->term->coeff<<" X "<<a.poly->term->degree;
        a.poly=a.poly->link ; 
    }
cout<<endl;
}

此代码使用链接列表来存储多项式。 一个结构用于多项式度和coeff;另一个结构用于创建节点以创建链接列表。

我的代码有两个问题:

  1. 一个空的多项式,它是NULL但在构造函数中我的条件语句没有找到它。

  2. 为什么我的打印方法不起作用。

  3. 我在打印方法中遇到此问题

      

    在polynomial.exe中0x00c1166b处的未处理异常:0xC0000005:访问冲突读取位置0xcccccccc。

1 个答案:

答案 0 :(得分:1)

poly == NULL不是true的原因是poly未初始化。初始化poly(NULL)仅发生在未使用的其他构造函数中。

最好是取消list类型,而不是std::list(实际上,将listusing namespace std;一起用作标识符是一个非常糟糕的主意。 })。

class polynomial
{
private:
    list< Term > poly;

现在poly是默认构造的,因此poly->empty()true,您无需执行任何操作。

对于cons,您可以致电list::push_backlist::insert;列表的一般连接是list::splice。要遍历列表,请在++类型的对象上使用list< Term >::iterator运算符。