Oái sao ko ai giúp mình vậy ???
Đề bài : nhập 1 danh sách sinh viên = DSLK kép . Sau đó nhập điểm chuẩn và liên kết + in ra các sinh viên đậu .
Mình làm như sau :
C Code:
#include<stdio.h> #include<conio.h> #include<stdlib.h> #include<alloc.h> typedef struct sinhvien{ int d; sinhvien *ptiep; sinhvien *plui; }; typedef struct list{ sinhvien *pdau; sinhvien *pcuoi; }; void khoidau(list &l); void khoidau(list &l) { l.pdau=l.pcuoi=NULL; } sinhvien *tao(int n); sinhvien *tao(int n) { sinhvien *p; if(!p) return NULL; p->d=n; p->ptiep=p->plui=NULL; return p; } void chencuoi(list &l,sinhvien *p); void chencuoi(list &l,sinhvien *p) { if(l.pdau==NULL) l.pdau=l.pcuoi=p; else { p->plui=l.pcuoi; l.pcuoi->ptiep=p; l.pcuoi=p; } } void in(list l); void in(list l) { sinhvien *p; p=l.pdau; while(p) { p=p->ptiep; } } /*day la ham xet dau hay rot*/ void dc(list l,int h); void dc(list l,int h) { sinhvien *p; p=l.pdau; while(p) { if(((p->plui)==NULL)&&(p->d)<h) l.pdau=p->ptiep; else if((p->d)<h) { (p->plui)->ptiep=p->ptiep; (p->ptiep)->plui=p->plui; } if(((p->ptiep)==NULL)&&(p->d)<h) l.pcuoi=p->plui; p=p->ptiep; } } void main() { clrscr(); sinhvien *sv,*p; list l; int n,i,m,h; khoidau(l); for(i=1;i<=n;i++) { sv=tao(m); chencuoi(l,sv); } dc(l,h); in(l); getch(); }
Mình không biết trong cái hàm xét đậu hay rớt của mình :
1) phải làm sao để mà free bộ nhớ sau khi liên kết lại đây bởi vì như trên thì chỉ có "nối dây" lại cho đúng chứ không xoá được những phần tử bị loại ?
2) sao lúc mình nhập điểm của thí sinh đầu tiên mà bé hơn điểm chuẩn thì khi thực hiện hàm dc() xong , in ra nó vẫn tồn tại ?
Cám ơn nhiều nhé .
Đã được chỉnh sửa lần cuối bởi zkday2686 : 26-09-2008 lúc 08:31 AM.
Oái sao ko ai giúp mình vậy ???
Thứ nhất tớ lưu ý cậu lần sau nên để trong tag PHP .
Thứ hai nữa là cách viết này :
nên xem lại tí. Ý tớ là tổ chức lại cho gọn và dễ nhìn.C Code:
void A(); void A(){};
Rồi bi giờ câu 1. (Tớ chưa đọc code được nhưng có ý cho cậu thế này !)
VD thế này : A<->B<->C. Và cậu muốn bỏ nút B đi thì tớ làm như sau.
CNode *temp;
temp = B; (operator = hoặc gán trực tiếp )
sau đó A<-> C;
rồi free(temp);
Câu 2 thì tớ ko hiểu rõ code của cậu lắm. Tớ thấy hơi khó đọc. Cậu nên coi lại phong cách lập trình , đặt biến cũng như ghi chú cho dễ dàng. Tiếp nữa method này không có gì là khó cả . Tớ có ý như sau.
Đơn giản thế là được. Phải ko nhỉ ? Tớ cũng chưa được học cái này .Hôm thứ 3 vừa rồi ông thầy dạy nhưng tớ bận học nên ko biết. À mà cậu học trường nào thế. Chắc dễ trường tớ lắm, vì giờ phần lớn là dùng C++ để cài đặt chứ ít dùng C thế này, khó và mệt hơn ấy nhỉ ?C Code:
// Khai báo 1 pointer kểu sinhVien sử dụng nó để duyệt qua các phần tử của list. CSinhVien *pTest; pTest = pTop ; // pTop là con trỏ đầu của list đấy. // Duyệt toàn bộ list. while(pTest->next != NULL) { // Kiểm tra liệu sinh viên này có đủ t. chuẩn ko. if(pTest->diem < diemChuan) { // Nếu ko đủ t.c thì del đi. CSinhVien *pDel = pTest; pTest->pre = pTest->next; } }
Đã được chỉnh sửa lần cuối bởi zkday2686 : 26-09-2008 lúc 08:30 AM.
Thế này nhé mình không hiểu về cái liên kết này lắm.Nhưng mình nghĩ thế này.Vì sau khi qua hàm dc(..) thì sẽ sét được sv nào đạt đúng không?Như vậy để lưu lại kết quả sau khi xét này vào list l thì bạn nên truyền tham số là đối tham chiếu dc(list &l,int h).Không biết mình nghĩ thế có đúng không?