Nhờ xem giúp lỗi code danh sách sinh viên (có cấu trúc tự trỏ)

Mọi người sửa lỗi và code thêm phần giải phóng bộ nhớ động đã cấp phát giúp em với ạ?

include "stdio.h"
include "conio.h"
include "stdlib.h"
include "string.h"
typedef struct sinhvien
{
    char hoten[25], masv[5];
    int tuoi;
    struct sinhvien *next;
}sv;

int main()
{
    sv  *p, *pdau;
    pdau = NULL;
    int tuoi, i = 1;
    char tam[25];
    
    // nhap du lieu
    while(1)
    {
        printf("\nnhap thong tin cho sinh vien thu %d: ", i);
        printf("\nnhap ten: ");
        fflush(stdin);
        gets(tam);
        
        if(tam[0] == '\0') 
        {
                break;
        }
        if(pdau == NULL)
        {
            pdau = (sv*)malloc(sizeof(sv*));
            p = pdau;        
        }        
        else
        {
            p->next = (sv*)malloc(sizeof(sv*));
            p = p->next;
        }
        strcpy(p->hoten, tam);
        printf("\nnhap vao ma sinh: ", i);
        fflush(stdin);
        gets(p->masv);
        printf("\nnhap vao tuoi cua sv: ");
        scanf("%d%*c", &tuoi);
        p->tuoi = tuoi;
        p->next = NULL;
        i++;
    }        
    
    // xuat du lieu
    while(p!= NULL)
    {
        printf("\nten: %s\tma sinh vien: %s\ttuoi:", p->hoten, p->masv, p->tuoi);
        p->next;
    }
    
    // em chua biet giai phong bo nho da cap phat.
    getch();
    return 0;
}
1 Like

Bạn sửa lại tiêu đề với format lại code cho dễ đọc nhá :blush:

1 Like

While (Điều kiện lặp) . Nếu điều kiện vòng while bị sai thì nó mới dừng . Nhưng ở đây, điều kiện là 1 (True) nghĩa là luôn luôn đúng => lặp vô tận k bao giờ dừng !.

If(tam[0] == ‘\0’) . \0 là ký tự null , nghĩa là chuỗi đó không có ký tự nào cả => chuỗi rỗng => người dùng k nhập gì cả. Nếu so sánh tam[0] == 0 thì k được bởi vì tam là kiểu char nên làm sao có thể so sánh được với kiểu int được .

Giải phóng vùng nhớ thì dùng: delete tên_biến_cần_giải_phóng hoặc dùng delete[] tên_biên để giải phóng cho 1 mảng các vùng nhớ .

2 Likes

Trong phần code này thì bạn lần lượt gán các p->next = null hết rồi cuối cùng delete p; là xong

2 Likes

vâng em sửa đây ạ :blush:

em sửa edit lại code mà nó thành thế này anh ạ :smiley:

Bạn xem ở đây nhá :blush:

1 Like

cảm ơn anh nhá, em sửa được rồi ạ :blush:
anh xem giúp em phần điều kiện lặp với em giải phóng bộ nhớ như này được không ạ?

for (int j = 0; j < i; j++)
{
      p->next = NULL;
}

free(p);
getch();

1 Like

Bạn dùng 1 con trỏ pDau để trỏ vào cái node đầu tiên.
Tiếp theo bạn dùng thêm 1 con trỏ pNext để trỏ đến cái node cuối cùng .
Lấy Pdau -> Next = pNext; Sau đó gán null cho tất cả các node đằng sau pDau đến khi nào đến pDau thì thôi
Cuối dùng mới free(pDau) .

while(pDau -> next != NULL)
{
     pNext = pDau -> next;

     if(pNext == NULL)
     {
         delete (pNext);
     }

     if(pNext -> next -> next == NULL)
     {
         delete (pNext-> next);
     }

}

free(pDau);
2 Likes

cảm ơn anh ạ :smiley:
anh ơi cho em hỏi là ở phần nhập dữ liệu của em phải sửa lại điều kiện lặp như nào thì trương trình mới đúng ạ?

Tùy mình thôi . Nếu nhập dữ liệu với số lần biết trước thì cho người dùng nhập số lần n vào, Dùng for rồi cho nhập.
Không thì dùng While hoặc Do … While với 1 điều kiện dừng. Ví dụ: Khi người dùng bấm nút ESC thì thoát khỏi vòng lặp, k nhập nữa .

1 Like

ok. thank anh nha :smile:

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