30/09/2018, 17:04

Mọi người xem giúp em lỗi về 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("
nhap thong tin cho sinh vien thu %d: ", i);
        printf("
nhap ten: ");
        fflush(stdin);
        gets(tam);
        
        if(tam[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("
nhap vao ma sinh: ", i);
        fflush(stdin);
        gets(p->masv);
        printf("
nhap vao tuoi cua sv: ");
        scanf("%d%*c", &tuoi);
        p->tuoi = tuoi;
        p->next = NULL;
        i++;
    }        
    
    // xuat du lieu
    while(p!= NULL)
    {
        printf("
ten: %s	ma sinh vien: %s	tuoi:", p->hoten, p->masv, p->tuoi);
        p->next;
    }
    
    // em chua biet giai phong bo nho da cap phat.
    getch();
    return 0;
}
Thành Phạm viết 19:16 ngày 30/09/2018

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

ASCII viết 19:10 ngày 30/09/2018

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ớ .

ASCII viết 19:08 ngày 30/09/2018

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

Van Cuong viết 19:04 ngày 30/09/2018

vâng em sửa đây ạ

Van Cuong viết 19:09 ngày 30/09/2018

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

Thành Phạm viết 19:10 ngày 30/09/2018

Bạn xem ở đây nhá

Làm sao để có thể hiển thị syntax highlighting bằng markdown? Các bạn phải đánh dấu ``` như ví dụ dưới đây Chú ý, dấu ``` được tạo ra bởi nút nằm bên trái số 1 trên bàn phím, nút này sẽ là ~ khi bấm giữ Shift Ví dụ cho C Nội dung: ``` void main() { } ``` Và đừng quên ``` ở cuối Kết quả void main() { } Ví dụ cho Pascal Nội dung: ``` Program HelloWorld; Begin WriteLn('Hello world!') {no ";" is required after the last statement of a block - adding one adds a "null stateme…

Van Cuong viết 19:07 ngày 30/09/2018

cảm ơn anh nhá, em sửa được rồi ạ
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();

ASCII viết 19:10 ngày 30/09/2018

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);
Van Cuong viết 19:05 ngày 30/09/2018

cảm ơn anh ạ
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 ạ?

ASCII viết 19:19 ngày 30/09/2018

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 .

Van Cuong viết 19:09 ngày 30/09/2018

ok. thank anh nha

Bài liên quan
0