编程论坛's Archiver

janevans 发表于 2008-6-9 01:02

请高手指教!链表应用的中小问题

#include<iostream.h>
#include<process.h>


struct NODE{
float coef;//系数
int exponent;//指数
NODE* next;
};
typedef NODE* head_ptr;






class POLYNIMIAL{
public:
    POLYNIMIAL();
        POLYNIMIAL(POLYNIMIAL&);
        ~POLYNIMIAL();
        void insert(float ,int );
        void display();
        POLYNIMIAL operator =(const POLYNIMIAL&);
        friend POLYNIMIAL operator + (const POLYNIMIAL&,const POLYNIMIAL&);
   
private:
        NODE* seek_exponent(int n)
        {
                if (head->next==NULL){
                        return NULL;
                       
                }else{
                NODE* ptr=head->next;
                while(ptr!=NULL){
                        if(ptr->exponent==n)
                                break;
                    ptr=ptr->next;
                }
                return ptr;
                }
        }
                    
        head_ptr head;
};



POLYNIMIAL::POLYNIMIAL(){
        head=new NODE;
    head->next=NULL;
}


POLYNIMIAL::POLYNIMIAL(POLYNIMIAL& p){
     head=p.head;
}
POLYNIMIAL::~POLYNIMIAL(){
        NODE*ptr ;
        while(head!=NULL){
       ptr=head;
           head=head->next;
           delete ptr;
}
          
}


void POLYNIMIAL::insert(float c,int e)
{   
   
        if (seek_exponent(e)!=NULL){
                NODE* temp=seek_exponent(e);
                temp->coef+=c;
       
        }else{

        NODE* element;
        element=new NODE;
        element->coef=c;
        element->exponent=e;
        if (head->next==NULL)
        {
                head->next=element;
            element->next=NULL;
               
        }else{
                NODE*temp=head->next;
                while(temp->next!=NULL && temp->next->exponent<e )
                        temp=temp->next;
                element->next=temp->next;
                temp->next=element;
        }
        }
}


void POLYNIMIAL::display()
{
        NODE*temp;
        temp=head->next;
        while(temp !=NULL)
        {
                cout<<temp->coef<<"x^"<<temp->exponent<<"+";
                temp=temp->next ;
        }
        cout<<endl;
}


POLYNIMIAL operator + (const POLYNIMIAL& p1,const POLYNIMIAL& p2)//应该是这个函数的问题,请高手指教一下怎么重载这个运算符
{  
       
        POLYNIMIAL temp;
        temp.head=p1.head;
        NODE* pt2;
       
    pt2=(p2.head)->next ;
        while(pt2!=NULL){

                float c=pt2->coef ;
                int e=pt2->exponent ;
                temp.insert (c,e);
                pt2=pt2->next ;
               
               
        }
return temp;
}


POLYNIMIAL POLYNIMIAL::operator = (const POLYNIMIAL& a){
    head=a.head ;
return *this;
}

void main()
{
   POLYNIMIAL p,p2;
   p.insert(1,2);
   p.insert (2,4);
   p.insert (3,8);
   p.insert (2,2);
   p2.insert(1,2);
   p2.insert (2,4);
   p2.insert (3,8);
  
   p2.display ();//这两个函数都运行成功。屏幕有显示
   p.display ();
    POLYNIMIAL p1;
   p1=p+p2;//这个有问题,不知道为什么。
}


刚看了下链表,试一下用链表实现多项式的相加。结果编译链接都没错。就是运行时出错,程序终止。

beyond0702 发表于 2008-6-9 02:58

POLYNIMIAL POLYNIMIAL::operator = (const POLYNIMIAL& a)问题应该在这里,p+p2 返回的临时对象 你用 &a  来引用它并做为参数(可是临时对象马上就要被析构了),而之后你还调用 =,赋给 p1;试一下这里不用 引用
{
    head=a.head ;
return *this;
}

janevans 发表于 2008-6-9 10:50

按引用调用是为了减少空间,不用建立新的副本。去掉了& 也不行。问题应该是出在了析构函数里面。系统调用+函数的时候。析构了临时对象,而临时对象是没有分配空间。所以delete错了。

d9com123 发表于 2008-6-9 20:51

不懂LZ写的copy构造函数,operator +, operator =中的head=p.head;  temp.head=p1.head;
head=a.head ;
这几句的意思LZ是否清楚?!
个人建议,重写下这三个函数呀。

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.