Giúp mình: Lỗi nạp chồng toán tử??

Mình đã mất rất nhiều thời gian với bài nảy! Mong những ai đọc nó hãy góp ý giúp mình … cảm ơn các bạn!

Mình có hàm nạp chồng so sánh như sau::

int PhanSo::operator>(PhanSo *M)
{
    float i, j;
    i = float(this->tuso);
    j = float(M->tuso);
    if(float(i/mauso) > float(j/(M->mauso)) )
       return 1;
    else
       return 0;
}

Sau đó mình sử dụng nó trong hàm này::

void SapXep()
{
        PhanSo *a, *b;
        float i,j;
        a = first;             
        b = NULL;
        while(a!=NULL)
        {
           b = a->lnext();
           while(b!=NULL)
           {
               if(a>b)
                  Doi(a, b);
               b = b->lnext();
           }
           a = a->lnext();
        }
}

Kết quả là Doi(a, b) trong hàm SapXep() không bao giờ xảy ra??? Nhưng nếu sửa thành::

void SapXep()
{
        PhanSo *a, *b;
        float i,j;
        a = first;             
        b = NULL;
        while(a!=NULL)
        {
           b = a->lnext();
           while(b!=NULL)
           {
               i = float(a->tuso);
               j = float(b->tuso);
               if(float(i/(a->mauso)) > float(j/(b->mauso) ))
                  Doi(a, b);
               b = b->lnext();
           }
           a = a->lnext();
        }
}

thì bài code run tốt! Vậy lỗi là do đâu?? Với cách gọi if(a>b) thì trình biên dịch có vấn đề gì làm Doi(a, b) ko thực thi được??

ĐÂY LÀ TOÀN BÀI CODE CỦA MÌNH:::


#include<iostream.h>
#include<conio.h>

class PhanSo
{
      private:
              int tuso;
              int mauso;
              PhanSo *next;
      public:
             PhanSo()
             {
                     next = NULL;
                     tuso = 0;
             }
             void ltuso(int tuso)
             {
                  this->tuso = tuso;
             }
             void lmauso(int mauso)
             {
                  this->mauso = mauso;
             }
             friend istream& operator>>(istream &in, PhanSo *&M);
             friend ostream& operator<<(ostream &out, PhanSo *&M);
             friend int USCLN(PhanSo *M);
             friend void SapXep();
             friend void Doi(PhanSo *M, PhanSo *N);
             int operator>(PhanSo *M);
             PhanSo* operator+(PhanSo *M);
             void dnext(PhanSo *M){ this->next = M; }
             PhanSo* lnext(){ return this->next; }
  
  
             
};


PhanSo *first, *last, *p;
char c;

int PhanSo::operator>(PhanSo *M)
{
    float i, j;
    i = float(this->tuso);
    j = float(M->tuso);
    if(float(i/mauso) > float(j/(M->mauso)) )
       return 1;
    else
       return 0;
}
PhanSo* PhanSo::operator+(PhanSo *M)
{
        PhanSo *a;
        a->tuso = this->tuso*M->mauso + M->tuso*this->mauso;
        a->mauso = this->mauso*M->mauso;
        return a;
}
istream& operator>>(istream &in, PhanSo *&M)
{
         cout<<"Nhap vao phan so: ";
         in>>M->tuso>>c>>M->mauso;
         return in; 
}
ostream& operator<<(ostream &out, PhanSo *&M)
{
         if(M->tuso == M->mauso) 
            out<<"1"<<endl;
         else
         {
            if(USCLN(M) == M->mauso)
               out<<M->tuso/USCLN(M)<<endl;
            else
               out<<M->tuso/USCLN(M)<<"/"<<M->mauso/USCLN(M)<<endl; 
         }
            return out;   
} 

int USCLN(PhanSo *M)
{
    int temp;
    int i;
    if(M->tuso < M->mauso)
       temp = M->tuso;
    else
       temp = M->mauso;
       
    for(i=temp; i>=1; --i)
    {
       if(M->tuso % i ==0 && M->mauso % i ==0)
       break;
    }
    return i;
}
void Nhap()
{
     do
     {
           p = new PhanSo;
           cin>>p;
           if(first == NULL)
           {
                    first = p;
                    last = p;
           }
           else
           {
               last->dnext(p);
               last=p;
           }
           cout<<"Ban co muon nhap tiep khong?? c/k";
           c = getch();
           cout<<endl;
     }while(c!='k');
}
void Xuat()
{
     PhanSo *a;
     a = first;
     while(a!=NULL)
     {
        cout<<a;
        a = a->lnext();
     }
}
void Doi(PhanSo *M, PhanSo *N)
{
     int temp;
     temp = M->tuso;
     M->ltuso(N->tuso);
     N->ltuso(temp);
   
     temp = M->mauso;
     M->lmauso(N->mauso);
     N->lmauso(temp);
}
void SapXep()
{
        PhanSo *a, *b;
        float i,j;
        a = first;             
        b = NULL;
        while(a!=NULL)
        {
           b = a->lnext();
           while(b!=NULL)
           {
               if(a>b)
                  Doi(a, b);// ĐOẠN NÀY ĐÂY??
           }
           a = a->lnext();
        }
}

main()
{
    first = NULL;
    Nhap();
    SapXep();
    Xuat();
    getch();
}

void SapXep()
{
PhanSo *a, *b;
float i,j;
a = first;
b = NULL;
while(a!=NULL)
{
b = a->lnext();
while(b!=NULL)
{
if(a>b)
Doi(a, b);// ĐOẠN NÀY ĐÂY??
}
a = a->lnext();
}
}

Nhìn sơ qua thì sai chỗ này:
a và b là 2 con trỏ , không phải 2 đối tượng lớp phân số .
Nên khi bạn viết if(a>b ) thì đơn giản đây chỉ là so sánh giá trị 2 con trỏ ( đia chỉ thực ra cũng là số nguyên)

Nếu bạn viết thành (*a)>b thì OK.