30/09/2018, 18:49

Sắp Xếp trong danh sách liên kết đơn

Tình hình e có làm 1 danh sách liên kết đơn bao gồm họ và tên sinh viên,mã số.E muốn sắp xếp theo mã số nhưng khi sắp xếp chỉ có mã số sắp xếp theo thứ tự còn thông tin thì nó không thay đổi(Cái này e cũng đoán ra vì e chỉ cho con trỏ trỏ đến mã số)Ai có ý tưởng gì để nó lấy luôn cả họ và tên đi theo không?Tiện e cũng hỏi luôn ý tưởng sắp xếp theo họ và tên .Gà mới mong mn giúp đỡ

yoloh3 viết 20:52 ngày 30/09/2018

Không biết bác đã học đến struct chưa, nếu học rồi thì dùng struct rất là đơn giản

Nguyễn Hùng viết 20:57 ngày 30/09/2018

e làm dslk bằng struct mà nhưng khác là thêm 1 con trỏ liên kết *next

yoloh3 viết 20:50 ngày 30/09/2018

Tức là dùng danh sách liên kết hả?
Mà bác đã dùng struct tức là mỗi sinh viên được bao gói trong 1 struct, vậy thì làm gì có chuyện thay đổi mã số thông tin sv không thay đổi theo, nó luôn đi với nhau mà

Nguyễn Hùng viết 20:51 ngày 30/09/2018

void HoanVi(int &a, int &b) { int c = a; a = b; b = c; } void SapXep(List &l) { NhanVien *i, *j; for (i = l.dau;i != l.cuoi;i = i->next) { for (j = i->next;j != NULL;j = j->next) { if (i->ms>j->ms) { HoanVi(i->ms, j->ms); } } } HienThi(l); }

Nguyễn Hùng viết 20:51 ngày 30/09/2018

hàm sắp xếp của mình ntn.Và nó lấy mã số người này gán cho người kia

yoloh3 viết 20:53 ngày 30/09/2018

Mình cũng hiểu sơ sơ về code của bạn rồi. Điểm chốt mà bạn sai là hoán vị ở đây là phải hoán vị cả cái struct chứ ko phải hoán vị mỗi cái ‘ms’. Bạn tráo đổi 2 sinh viên cho nhau chứ có phải tráo đổi ms của 2 sinh viên đâu ( mã số của thằng A cũng như Chứng minh thư của nó, ai lại đi cho thằng bạn được).
Còn cách tráo đổi 2 sinh viên cho nhau thì bạn dùng hàm HoanVi (NhanVien *a, NhanVien *b);

Nguyễn Hùng viết 20:57 ngày 30/09/2018

để mình thử xem.Cám ơn bạn nhé

Nguyễn Hùng viết 20:58 ngày 30/09/2018

đã thử và nó không đổi vị trí

yoloh3 viết 20:52 ngày 30/09/2018

Bạn up code lên mình thử xem có sửa đc ko.

Liêu Đức Mạnh viết 20:49 ngày 30/09/2018

Bạn phải làm 1 cái hàm đổi. ví dụ struct SV của bạn có ms, tên, điểm.

void swap(sv s1,sv s2){
sv temp;
strcpy(temp.ms,s1.ms);
strcpy(temp.ten,s1.ten);
temp.diem=s1.diem;
// Ở phần sau thì tương tự cái trên
}

Theo mình thì làm như thế này. Đổi từng giá trị hết.

abcxyz viết 20:58 ngày 30/09/2018

khi thay đổi thứ tự thì phải thay đổi cả struct hoặc class của sv đó , chứ k phải thay đổi mỗi trường mã số, vì bạn đang làm 1 bài toán mà kiểu dữ liệu của nó k có sẵn trong c / c++ nên bạn phải dùng struct hoặc class để tạo ra 1 kiểu dl phù hợp cho bài toán, khi thay đổi chú ý bạn thay đổi thứ tự của cái gì>?

Nguyễn Hùng viết 21:02 ngày 30/09/2018

Cám ơn bác đã chia sẻ.Đã làm và thành công rực rỡ )
E xin chia sẻ thêm là trong hàm strcpy còn phả thêm 2 bước nữa là copy s2 cho s1,và copy temp cho s2
Cám ơn luôn bạn Nấm lùn IT nhé mn giúp đỡ nhiệt tình quá

Nguyễn Hùng viết 20:54 ngày 30/09/2018

Tiện topic này hỏi luôn mn có ý tưởng gì về sắp xếp danh sách theo tên sinh viên không?Xem 1 số thì có bảo dùng hàm strcmp so sánh mà e còn hơi mơ hồ

Nguyễn Hùng viết 20:56 ngày 30/09/2018

ý tưởng của e là tách riêng hotendem va ten thanh 2 chuỗi làm thì cũng ok rồi nhưng e muốn mn cho e ý kiến ví dụ là chỉ 1 chuỗi hovaten luôn mà nó biết đâu là ten để so sánh

Liêu Đức Mạnh viết 21:04 ngày 30/09/2018

Do mình lười nên không ghi tiếp ấy mà :v

Bài liên quan
0