30/09/2018, 16:08

Lỗi cú pháp khi sử dụng cấu trúc tự trỏ và danh sách liên kết

Code của mình thực hiện yêu cầu:Viết chương trình quản lí họ tên và điểm thi học kì và in ra danh sách các học sinh thi lại.(có điểm trung bình<5.0)
Khi build thì không có lỗi nhưng khi chạy thì lại có thông báo dừng chương trình do một nguyên nhân nào đó. Nhờ mọi người fix lại giúp mình.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
    typedef struct hoc_sinh {
        char ho_ten[20];
        float diem;
        struct hoc_sinh *tiep;
    } sv_1;
    sv_1 *hoc_sinh1=NULL,*hoc_sinh2=NULL;
    char name[20];
    float diem1;
    int n=0;
    do {
        hoc_sinh1=(sv_1*)malloc(sizeof(sv_1));
        if(hoc_sinh1==NULL)
            printf("Khong du bo nho de cap phat");
        else {
            printf("Ho va ten:");
            fflush(stdin);
            gets(name);
            if(strcmp(name,"")!=0) {
                strcpy(hoc_sinh1->ho_ten,name);
                printf("diem:");
                scanf("%f",&diem1);
                hoc_sinh1->diem=diem1;
                if(n==0)
                    hoc_sinh2=hoc_sinh1;
                hoc_sinh1=hoc_sinh1->tiep;
            }
        }
    }
    while(strcmp(name,"")!=0);
    printf("danh sach cac hoc sinh thi lai.
");
    while(hoc_sinh2!=NULL) {
        if((hoc_sinh2->diem)<5.0)
        printf("%d	%s	%.1f",n+1,hoc_sinh2->ho_ten,hoc_sinh2->diem);
        hoc_sinh2=hoc_sinh2->tiep;
    }
    return 0;
}
Nguyễn Minh Dũng viết 18:13 ngày 30/09/2018

Khi build thì không có lỗi nhưng khi chạy thì lại có thông báo dừng chương trình do một nguyên nhân nào đó.

@14520054 nhập dữ liệu vào như thế nào mà có lỗi, anh làm tới gần 10 người mà có lỗi gì đâu?

Chú ý điểm này, em không nên đặt tên không có nghĩa như sau:

char c[20];

BaoLe viết 18:17 ngày 30/09/2018

Em viết code trong code block,rồi nhập input bình thường.Nó vẫn in danh sách học sinh thi lại nếu có rồi có thêm 1 thông báo: có 1 vấn đề là nguyên nhân kết thúc chương trình của bạn hiện tại.

Nguyễn Minh Dũng viết 18:09 ngày 30/09/2018

có 1 vấn đề là nguyên nhân kết thúc chương trình của bạn hiện tại.

Ủa anh đâu thấy thông báo gì đâu?

BaoLe viết 18:12 ngày 30/09/2018

A problem caused the program to stop working correctly.Windows will does the program and notify you if a solution is available

Nguyễn Minh Dũng viết 18:15 ngày 30/09/2018

A problem caused the program to stop working correctly.Windows will does the program and notify you if a solution is available

Anh không thấy lỗi này, nhưng anh thấy chương trình em có một điểm có thể gây ra lỗi này. Đó là em cấp phát vùng nhớ cho hoc_sinh1 nhưng không hủy nó đi.

hoc_sinh1=(sv_1*)malloc(sizeof(sv_1));

Em cho anh xem hình chụp màn hình lúc em bị lỗi xem. Cho anh xem cả console lúc đấy, xem nó in ra được cái gì.

BaoLe viết 18:17 ngày 30/09/2018

Nguyễn Minh Dũng viết 18:19 ngày 30/09/2018

Trường hợp này khó debug quá

Em thử thêm free(hoc_sinh2); như dưới xem.

while(hoc_sinh2!=NULL) {
        if((hoc_sinh2->diem)<5.0)
            printf("%d\t%s\t%.1f",n+1,hoc_sinh2->ho_ten,hoc_sinh2->diem);
        free(hoc_sinh2);
        hoc_sinh2=hoc_sinh2->tiep;
    }
minh tran viết 18:13 ngày 30/09/2018

mình để ý thấy n của bạn chưa có tăng khi mà nhập 1 học sinh mới, ko bik đúng ko

BaoLe viết 18:10 ngày 30/09/2018
#include<stdio.h>
#include<stdlib.h>
typedef struct hoc_sinh {
    char ky_tu;
    struct hoc_sinh *tiep;
} sv;
int main() {
    sv *sinh_vien1=NULL,*sinh_vien2=NULL;
    char ky_tu1;
    int n=0,m=0;
    do {
        if(sinh_vien2==NULL) {
            sinh_vien2=(sv*)malloc(sizeof(sv));
            sinh_vien1=sinh_vien2;
        } else {
            sinh_vien2->tiep=((sv*)malloc(sizeof(sv)));
            sinh_vien2=sinh_vien2->tiep;
            n++;
        }
        ky_tu1=getchar();
        if(ky_tu1!=' ') {
            sinh_vien2->ky_tu=ky_tu1;
        }
        sinh_vien2->tiep=NULL;
    } while(ky_tu1!=' ');
    sinh_vien2=sinh_vien1;
    while(m!=(n-1)) {
        m++;
        sinh_vien2=sinh_vien2->tiep;
        if(m==(n-1))
            sinh_vien2->tiep=NULL;
    }
    sinh_vien2=sinh_vien1;
    while(sinh_vien2!=NULL) {
        printf("%c",sinh_vien2->ky_tu);
        sinh_vien2=sinh_vien2->tiep;
    }
    return 0;
}

Dựa vào gợi ý của anh em mới fix lại được rồi nek, chạy ngon, Nhưng em muốn nhờ anh test lại thử có cách nào ngắn hơn không?

Nguyễn Minh Dũng viết 18:22 ngày 30/09/2018

Vậy em có tìm được lý do không?

Mà sao em malloc mà không free đi, về sau có hại lắm đấy.

BaoLe viết 18:13 ngày 30/09/2018

Do mới nghĩ ra nên post lên cho anh coi thử, nên ko free. Lý do em hiểu muk sao khó viết ra quá.

Nguyễn Minh Dũng viết 18:25 ngày 30/09/2018

Dù em có giải quyết được vấn đề thì em cũng phải nghên cứu free vùng nhớ em đã cấp đi.

BaoLe viết 18:12 ngày 30/09/2018
#include<stdio.h>
#include<stdlib.h>
typedef struct hoc_sinh {
    char ky_tu;
    struct hoc_sinh *tiep;
} sv;
int main() {
    sv *sinh_vien1=NULL,*sinh_vien2=NULL;
    char ky_tu1;
    int n=0,m=0;
    do {
        if(sinh_vien2==NULL) {
            sinh_vien2=(sv*)malloc(sizeof(sv));
            sinh_vien1=sinh_vien2;
        } else {
            sinh_vien2->tiep=((sv*)malloc(sizeof(sv)));
            sinh_vien2=sinh_vien2->tiep;
            n++;
        }
        ky_tu1=getchar();
        if(ky_tu1!=' ') {
            sinh_vien2->ky_tu=ky_tu1;
        }
        sinh_vien2->tiep=NULL;
    } while(ky_tu1!=' ');
    sinh_vien2=sinh_vien1;
    while(m!=(n-1)) {
        m++;
        sinh_vien2=sinh_vien2->tiep;
        if(m==(n-1))
            sinh_vien2->tiep=NULL;
    }
    sinh_vien2=sinh_vien1;
    while(sinh_vien2!=NULL) {
        printf("%c",sinh_vien2->ky_tu);
        sinh_vien2=sinh_vien2->tiep;
    }
    sinh_vien2=sinh_vien1;
    while(sinh_vien2!=NULL) {
        sinh_vien2=sinh_vien1->tiep;
        free(sinh_vien1);
        sinh_vien1=sinh_vien2;
    }
    return 0;
}

Em free thế này đã ổn chưa anh Đạt?

Nguyễn Minh Dũng viết 18:16 ngày 30/09/2018

Em suy nghĩ thử là em tạo ra bao nhiêu sinhvien thì em phải hủy bấy nhiêu sinh viên. Anh chưa coi code em, sinhvien1,sinhvien2 nhức đầu quá

Bài liên quan
0