设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 1836|回复: 3
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-4 00:52:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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;//这个有问题,不知道为什么。
}


刚看了下链表,试一下用链表实现多项式的相加。结果编译链接都没错。就是运行时出错,程序终止。
2#
发表于 2009-11-4 00:52:46 | 只看该作者
POLYNIMIAL POLYNIMIAL::operator = (const POLYNIMIAL& a)问题应该在这里,p+p2 返回的临时对象 你用 &a  来引用它并做为参数(可是临时对象马上就要被析构了),而之后你还调用 =,赋给 p1;试一下这里不用 引用
{
    head=a.head ;
return *this;
}
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-4 00:52:47 | 只看该作者
按引用调用是为了减少空间,不用建立新的副本。去掉了& 也不行。问题应该是出在了析构函数里面。系统调用+函数的时候。析构了临时对象,而临时对象是没有分配空间。所以delete错了。
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-4 00:52:48 | 只看该作者
不懂LZ写的copy构造函数,operator +, operator =中的head=p.head;  temp.head=p1.head;
head=a.head ;
这几句的意思LZ是否清楚?!
个人建议,重写下这三个函数呀。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-18 22:33 , Processed in 0.134100 second(s), 8 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表