Đề /*Th™ng tin s‡ch gồm: m‹ s‡ch, t•n s‡ch, nhˆ xuất bản, năm xuất bản, số lượng, đơn gi‡ vˆ thˆnh tiền (= số lượng * đơn gi‡) Cần thực quản lý c‡c s‡ch dạng li•n kết đơn: -Tạo danh s‡ch li•n kết đơn lưu trữ c‡c s‡ch -Nhập vˆo danh s‡ch c‡c s‡ch -In lại ds c‡c s‡ch đ‹ nhập đ— -In danh s‡ch t•n c‡c s‡ch c— đơn gi‡ tr•n 50.000đ -T“m kiếm s‡ch c— m‹ lˆ k -T“m kiếm s‡ch c— t•n lˆ s -T’nh tổng tiền tất c‡c s‡ch c— danh s‡ch -Sắp xếp danh s‡ch s‡ch theo số lượng tăng dần -Cho biết t•n s‡ch c— đơn gi‡ cao nht ỗp dng cc yãu cu trãn */ Phn II: gợi ý triển khai Khai báo cấu trúc dạng DSLK đơn để quản lý danh sách sách struct Sach { int maS; char tenS[30]; char nhaXB[30]; int namXB; int soL; float donG; float thanhT; }; struct Node { Sach info; struct Node *next; }; struct List { Node *Head; Node *Tail; }; Cài đặt CTC gồm: nhập thông tin sách, in thông tin sách void nhapSach(Sach &x) { printf("Ma Sach:"); scanf("%d",&x.maS); printf("Ten Sach:"); fflush(stdin); gets(x.tenS); printf("Nha Xuat Ban:"); fflush(stdin); gets(x.nhaXB); printf("Nam Xuat Ban:"); scanf("%d",&x.namXB); printf("So Luong:");scanf("%d",&x.soL); printf("Don Gia:");scanf("%f",&tg); x.donG = tg; x.thanhT = x.soL * x.donG; } void inSach(Sach x) { printf("\n %4d",p->info.maS); printf("%15s", p->info.tenS); printf("%15s", p->info.nhaXB); printf("%7d",p->info.namXB); printf("%7d",p->info.soL); printf("%7.2f",p->info.donG); printf("%12.2f",p->info.thanhT); } Định nghĩa hàm khởi tạo danh sách rỗng, hàm tạo nút chứa thông tin sách, hàm chèn thêm nút vào đầu danh sách, hàm xóa nút đầu danh sách void init(List &Q) { Q.Head = NULL; Q.Tail = NULL; } Node *getNode(Sach x) { Node *p; p = new Node(); if(p==NULL) { printf("\n Khong cong"); exit(0); } p->info = x; p->next = NULL; return p; } void chenDau(List &Q, Node *p) { if(Q.Head == NULL) { Q.Head = p; Q.Tail =p; } else { p->next = Q.Head; Q.Head = p; } } void xoaDau(List &Q) { Node *p; if(Q.Head != NULL) { p = Q.Head; Q.Head = Q.Head->next; free(p); if(Q.Head==NULL) Q.Tail = NULL; } } Định nghĩa CTC thực xử lý với danh sách sách void nhapDSSach(List &Q) { int n,i; Node *p; Sach x; float tg; printf("Nhap so Sach:"); scanf("%d",&n); for(i=0;inext) inSach(p->info); } void InSachGia50(List Q) { Node *p; for(p=Q.Head; p!=NULL; p=p->next) if(p->info.donG > 50000) inSach(p->info); } Cài đặt CTC tìm kiếm sách xếp sách Node *TimSachMa(List Q,int k) { Node *p; for(p=Q.Head; p!=NULL; p=p->next) if(p->info.maS==k) break; return p; } Node *TimSachTen(List Q,char s[]) { Node *p; for(p=Q.Head; p!=NULL; p=p->next) if(strcmp(p->info.tenS,s)==0) break; return p; } void TinhTongTien(List Q) { float s=0; Node *p; for(p=Q.Head; p!=NULL; p=p->next) s = s + p->info.thanhT; printf("\n Tong tien cac quyen sach la: %7.2f", s); } void SXSachSoLuongTang(List &Q) { Node *p,*q; Sach tg; for(p=Q.Head; p!=NULL; p=p->next) for(q=p->next; q!=NULL; q=q->next) if(p->info.soL > q->info.soL) { tg = p->info; p->info = q->info; q->info = tg; } } void TenSachMax(List Q) { float max; Node *p; max = p->info.donG; for(p=Q.Head; p!=NULL; p=p->next) if(p->info.donG > max) max = p->info.donG; printf("\n Ten cac quyen sach co don gia cao nhat la \n"); for(p=Q.Head; p!=NULL; p=p->next) if (p->info.donG == max) printf("\n %15s",p->info.tenS); } Áp dụng yêu cầu int main() { List Q; Node *p; init(Q); nhapDSSach(Q); printf("\n\n\n DSCB da nhap:"); inDSSach(Q); printf("\n\n\n Quyen sach cc gia 50.000:"); InSachGia50(Q); int k; printf("\n\n Nhap ma can tim:"); scanf("%d",&k); p=TimSachMa(Q,k); if(p==NULL) printf("\n Khong tim thay \n"); else printf("\n Co tim thay \n"); char s[30]; printf("\n\n Nhap t•n can tim:"); gets(s); p=TimSachTen(Q,s); if(p==NULL) printf("\n Khong tim thay \n"); else printf("\n Co tim thay \n"); TinhTongTien(Q); SXSachSoLuongTang(Q); printf("\n\n\n DS Sach da sap xep So luong tang dan:"); inDSSach(Q); TenSachMax(Q); xoaDau(Q); printf("\n\n\n DSCB da thuc hien huy ptu dau: "); inDSSach(Q); //getch(); }