Quản lí Sinh Viên Bằng Danh Sách liên kết lập trình C Sau hơm mệt, Hơm Kitti định làm thay tiếp tục sửa quản lí hàng hóa hơm trước Nghe khả quan mong anh em tiếp tục đóng góp ý kiến: C Code: Select All | Show/Hide #include #include #include #include typedef struct tagSINHVIEN { int Msv; char Hoten[35]; int ngay, thang, nam; float Toan; float Van; float TK; }SINHVIEN, *PSINHVIEN; typedef struct tagNODE { SINHVIEN Data; tagNODE* Next; }NODE, *PNODE; typedef struct tagLIST { NODE* Dau; NODE* Cuoi; }LISTSV, *PLIST; //Khoi tao NODE NODE* KhoitaoNode() { NODE* x = (NODE*)malloc(sizeof(NODE)); if(x == NULL) { printf("\n Bo nho khong du "); return 0; } x->Next = NULL; return x; } //Khoi tao danh sach LISTSV void KhoitaoList(LISTSV* x) { x->Dau = NULL; x->Cuoi=NULL; } //Nhap thong tin sinh vien void Nhap (NODE* x) { char tg[25]; int a, d, m, y; float t, c; printf("\nNhap ma Sinh vien: "); scanf("%d", &a); x->Data.Msv = a; fflush(stdin); printf("Nhap ten Sinh Vien: "); gets(tg); strcpy(x->Data.Hoten,tg); fflush(stdin); { printf("Nhap Ngay Sinh: "); scanf("%d", &d); fflush(stdin); }while(d > 31 || d < 1); x->Data.ngay = d; { printf("Nhap Thang Sinh: "); scanf("%d", &m); fflush(stdin); }while(m > 12 || m < 1); x->Data.thang = m; { printf("Nhap Nam Sinh: "); scanf("%d", &y); fflush(stdin); }while(y > 9999 || y < 1000); x->Data.nam = y; fflush(stdin); { printf("Nhap Diem Toan: "); scanf("%f", &c); }while(c < || c > 10); x->Data.Toan = c; fflush(stdin); { printf("Nhap Diem Van: "); scanf("%f", &t); }while(c < || c > 10); x->Data.Van = t; x->Data.TK = (x->Data.Toan + x->Data.Van)/2; fflush(stdin); x->Next = NULL; } //in sinh vien void InSV(NODE* p) { printf("\nMa Sinh vien: %d ",p->Data.Msv); printf("\tTen Sinh vien: %s ",p->Data.Hoten); printf("\nNgay/ Thang/ Nam sinh: %5d/%5d/%5d ", p->Data.ngay, p- >Data.thang, p->Data.nam); printf("\nDiem Toan: %.2f printf("\tDiem Van: %.2f ", p->Data.Toan); ", p->Data.Van); printf("\tDiem tong ket: %.2f\n\n\n", p->Data.TK); } // in danh sach SINHVIEN void InDanhSach(LISTSV x) { NODE *p; p = x.Dau; while(p != NULL) { InSV(p); p = p->Next; } } //Them mot NODE vao Cuoi danh sach void ThemCuoi(LISTSV* x, NODE* t) { if(x->Dau == NULL) { x->Dau = t; } else { x->Cuoi->Next = t; } x->Cuoi = t; } // Them mot sinh vien vao cuoi danh sach int NhapSV(LISTSV* x) { NODE* a = KhoitaoNode(); Nhap(a); ThemCuoi(x,a); return 0; } //Tim kiem theo Ma sinh vien void TimKiem(LISTSV x , int n) { NODE *p; p = x.Dau; while(p != NULL) { if(p->Data.Msv == n) { InSV(p); }else printf("\n Khong co sinh vien dat tieu chuan can tim\n"); p = p->Next; } } //Xoa Sinh Vien bat ki Theo ma Sinh Vien int XoaSV(LISTSV *x , int n) { NODE *p = x->Dau; NODE *q = NULL; while(p != NULL) { if(p->Data.Msv == n) break; q = p; p = p->Next; } if(p == NULL) return 0; if(q != NULL) { if(p == x->Dau) { x->Dau = q; q->Next = p->Next; free(p); } } else { x->Dau = p->Next; if(x->Dau == NULL) { x->Cuoi = NULL; } } return 1; } //Giai phong bo nho void giaiphong(LISTSV *x) { NODE *p = x->Dau; NODE *a; while( p->Next != NULL) { a = p; p = p->Next; free(a); } } //In cac Sinh Vien xep Loai Gioi void inSVGioi(LISTSV x) { NODE *p; p = x.Dau; while(p != NULL) { if(p->Data.TK >= 8) { InSV(p); } else printf("\n Khong co sinh vien dat tieu chuan can tim\n"); p = p->Next; } } //In cac Sinh Vien xep Loai Kha void inSVKha(LISTSV x) { NODE *p; p = x.Dau; while(p != NULL) { if(p->Data.TK < && p->Data.TK >= 7) { InSV(p); }else printf("\n Khong co sinh vien dat tieu chuan can tim\n"); p = p->Next; } } //Liet ke so SINHVIEN bi thi Lai void inSVThilai(LISTSV x) { NODE *p; p = x.Dau; while(p != NULL) { if(p->Data.Toan < || p->Data.Van < 5) { InSV(p); } else printf("\n Khong co sinh vien dat tieu chuan can tim\n"); p = p->Next; } } //Dem so SINHVIEN Hoc Lai void SVHocLai(LISTSV x) { NODE *p; int n = 0; p = x.Dau; while(p != NULL) { if(p->Data.Toan < && p->Data.Van < 5) { n++; } p = p->Next; } printf("\n So Cac sinh vien Phai Hoc Lai : %d\n", n); } // Liet ke Sinh vien Sinh vao thang 10 void inSV10(LISTSV x) { NODE *p; p = x.Dau; while(p != NULL) { if(p->Data.thang == 10) { printf("\n Cac sinh vien sinh vao thang 10 :"); InSV(p); }else printf("\n Khong co sinh vien dat tieu chuan can tim\n"); p = p->Next; } } //Ham Tao Danh Sach Tuy chon int Menu() { int a; int Ma; LISTSV x; KhoitaoList(&x); { printf("\n Ban chon 1,2,3,4,5"); printf("\n\nNhap so can chon roi bam enter"); printf("\n\n\n - Nhap danh sach Sinh Vien"); printf("\n - Liet ke danh sach Sinh Vien"); printf("\n - Tim kiem Sinh vien theo ma Hang"); printf("\n - Liet ke danh sach Sinh Vien dat loai gioi"); printf("\n - Liet ke danh sach Sinh Vien dat loai Kha"); printf("\n - Liet ke danh sach Sinh Vien Phai thi lai"); printf("\n - Tong So Sinh Vien Phai Hoc lai"); printf("\n - Liet ke cac sinh vien sinh vao thang 10:"); printf("\n - Xoa Sinh Vien theo Ma Sinh Vien"); printf("\n - Thoat\n"); scanf("%d",&a); switch(a) { case 1: { int n; printf("\nNhap so luong Sinh vien : "); scanf("%d",&n); for(int i = 1; i Dau,*q; 4 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 } q=NULL; while (p!=NULL) { if (p->Data.Msv==n) break; q=p; p=p->Next; } if (p==NULL) return 0; //không tim thay if (q!=NULL) { x->Cuoi=q; q->Next=p->Next; delete p; } else { x->Dau=p->Next; if(x->Dau==NULL) x->Cuoi=NULL; } return 1; Nguyên gửi vitbau1412 Hình xóa phần tử thơi, khơng xóa pt phía sau (sau xóa, bấm số để xuất xuất đầy đủ ban đầu) fix lại hàm xóa sinh viên theo mssv, bạn test thử xem: C Code: Select All | Show/Hide 28 int XoaSV(LISTSV *x , int n) 29 { NODE *p = x->Dau,*q; 30 q=NULL; 31 while (p!=NULL) 32 { 33 if (p->Data.Msv==n) 34 break; 35 q=p; 36 p=p->Next; 37 } 38 if (p==NULL) 39 return 0; //không tim thay 40 if (q!=NULL) 41 { 42 x->Cuoi=q; 43 q->Next=p->Next; 44 delete p; // C khơng có lệnh 45 } 46 47 48 49 50 51 52 53 54 } else { x->Dau=p->Next; if(x->Dau==NULL) x->Cuoi=NULL; } return 1; Hì, lệnh delete với new bên C++ (học thầy dạy tồn code C, trình biên dịch C++, cuối bị rối ln), bạn thay lệnh giải phóng vùng nhớ bên C mà bạn biết (mình khơng rõ bên C nữa) test post lên OK mà @kitti: vit bau nói đấy, chị test bị lỗi vậy, nhập rõ ràng ngày, tháng, năm sinh nên có bắt lỗi chứ! Một ngồi khóc ngồi trời bão tố người Trả lời với trích dẫn Quản lí Sinh Viên Bằng Danh Sách liên kết lập trình C Nguyên gửi vitbau1412 Hì, lệnh delete với new bên C++ (học thầy dạy tồn code C, trình biên dịch C++, cuối bị rối ln), bạn thay lệnh giải phóng vùng nhớ bên C mà bạn biết (mình khơng rõ bên C nữa) test post lên OK mà Mình dùng new với delete trBoorBorrland C for DOS mà.Nếu bạn khơng thích dùng new với delete dùng malloc với free Nếu dùng new lệnh cấp phát Code: p=new node; Lệnh cấp phát tương ứng dùng malloc Code: p=(node *)malloc(sizeof(node)); Cịn giải phóng vùng nhớ Code: delete p; bên là: Code: free(p); Trả lời với trích dẫn 01-04-2011, 09:17 PM#7 Với bạn, làm cho bạn nhập msv xóa liên tiếp , bạn muốn dừng lại ấn esc tiếp tục xóa ấn enter Tức là, bạn xóa hết sinh viên mà khơng phải lần xóa người lại phải chạy lại chương trình Bạn code thử so sánh với ... năm sinh nên c? ? bắt lỗi chứ! Một ngồi kh? ?c ngồi trời bão tố người Trả lời với trích dẫn Quản lí Sinh Viên Bằng Danh Sách liên kết lập trình C Nguyên gửi vitbau1412 Hì, lệnh delete với new bên C+ +... ke danh sach Sinh Vien dat loai gioi"); printf("
- Liet ke danh sach Sinh Vien dat loai Kha"); printf("
- Liet ke danh sach Sinh Vien Phai thi lai"); printf("
- Tong So Sinh Vien Phai Hoc... Liet ke cac sinh vien sinh vao thang 10:"); printf("
- Xoa Sinh Vien theo Ma Sinh Vien"); printf("
- Thoat
"); scanf("%d",&a); switch(a) { case 1: { int n; printf("
Nhap so luong Sinh vien