Thuật toán sapxep theo danh sách liên kết đơn

#include <iostream>
#include <iomanip>
#include <string>
#include <conio.h>
using namespace std;

class NGUOI {


protected:
    string maso;   // Ky tu dau tien la BC: Bien che, HD: Hop dong
    float luong;
   string hoten;

public:
    void nhap();

    void in();

    string getmaso() {
        return maso;
    }

    float getluong() {
        return luong;
    }
    string getten(){
    	return hoten;
	}
};

void NGUOI::nhap() {
    cout << endl << "Nhap ma so (BC: bien che, HD: hop dong): ";
    cin >> maso;
    cout << endl << "Nhap ho ten: ";
    cin.ignore();
    getline(cin, hoten);
}

void NGUOI::in() {
    cout << endl << setw(10) << maso << setw(30) << hoten << setw(10) << luong;
}

class BIENCHE : virtual public NGUOI {
private:
    float hsl, phucap;

public:
    void nhapBC() {
        cout << endl << "Nhap he so luong: ";
        cin >> hsl;
        cout << endl << "Nhap phu cap: ";
        cin >> phucap;
        luong = hsl * 180000 + phucap;
    }
};

class HOPDONG : virtual public NGUOI {
private:
    float ngaycong, tiencong, hsvg;

public:
    void nhapHD() {
        cout << endl << "Nhap ngay cong: ";
        cin >> ngaycong;
        cout << endl << "Nhap tien cong/ngay: ";
        cin >> tiencong;
        cout << endl << "Nhap he so vuot gio: ";
        cin >> hsvg;
        luong = ngaycong <= 26 ? ngaycong * tiencong : (26 + (ngaycong - 26) * hsvg) * tiencong;
    }
};

class VIENCHUC : public BIENCHE, public HOPDONG {
private:
	static int tsvc;
	static float tsluong;
	static float tsluongbc;
public:
	VIENCHUC(){
		tsvc++;
	}
	~VIENCHUC(){
		tsvc--;
		tsluong -= luong;
	}

	
    void nhap_vc() {
        nhap(); // Goi ham nhap o lop nguoi
        if (maso[0] == 'b' || maso[0] == 'B'){
            nhapBC();
            tsluongbc += luong;
        }
        else
            nhapHD();
        tsluong += luong;
    }

	static void sapxep(VIENCHUC **list) {
        for (VIENCHUC *i = *list; i != NULL; i = i->next) {
            for (VIENCHUC *j = i->next; j != NULL; j = j->next) {
                if (i->getluong() < j->getluong()) {
                    swap(*i, *j);
                }
            }
        }
    }

    static void in_ts(){
			cout<<endl<<"Tong so vien chuc: "<<tsvc<<" . Tong so luong: "<<tsluong;
			cout<<endl<<"Tong so luong cua Bien che: "<<tsluongbc;
		}
    void operator>(VIENCHUC a){
    	if(luong > a.luong){
    		cout<<endl<<"Vien chuc "+ a.getten()+ " co so tien lon hon Vien trong danh sach";
		}
		else
			cout<<endl<<"Vien chuc "+ a.getten()+ " co so tien nho hon Vien chuc trong danh sach";
	}
	VIENCHUC *next;
};

int VIENCHUC::tsvc=0;
float VIENCHUC::tsluong = 0.0;
float VIENCHUC::tsluongbc =0.0;
int main() {
    //thuat toan tao danh sanh lien ket don
	VIENCHUC *list = NULL, *last = NULL, *node =NULL;
	char tiep = 'c';
	while(tiep == 'c'){
		node = new VIENCHUC;
		node->nhap_vc();
		node->next = NULL;
		if(list==NULL){
			list = node;
			last = node;
		}else{
			last->next = node;
			last = node;
		}
		cout<<endl<<"Nhap tiep hay khong(c:tiep): ";
		tiep = getch();
	}
   cout << "\n Danh sach nhan vien truoc khi sap xep:" << endl;
    VIENCHUC *current = list;
    while (current != NULL) {
        current->in();
        current = current->next;
    }

    VIENCHUC::sapxep(&list);

    cout << "\n Danh sach nhan vien sau khi sap xep:" << endl;
    current = list;
    while (current != NULL) {
        current->in();
        current = current->next;
    }

    
    VIENCHUC::in_ts();   
}

Bạn đang muốn hỏi gì? Hay đây chỉ là bài chia sẻ của bạn?

mình đang hỏi xem có cách nào để thuât toán sapxep hoạt động không mình thử mọi cách mà nó không hoạt động dược

Mình đoán là swap hoạt động không như bạn mong muốn, bạn debug ở chỗ đấy đi

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?