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;
}
Bài liên quan
Bạn sửa lại tiêu đề với format lại code cho dễ đọc nhá
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ớ .
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
vâng em sửa đây ạ
em sửa edit lại code mà nó thành thế này anh ạ
Bạn xem ở đây nhá
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 ạ?
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) .
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 ạ?
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 .
ok. thank anh nha