Trước khi vào bài, bạn đọc hãy chắc chắn rằng đã học qua từ bài 1 đến bài 7 trong seri “Danh sách kề sử dụng mảng” của loại bài cấu trúc dữ liệu và giải thuật. Tất cả các hàm trong bài thực hành này đều được nêu ra trong những bài trước vì thế, nếu quên bạn đọc có thể tự xem lại ở những bài trước.

1.Yêu cầu đề bài

Trên ngôn ngữ C/C++, viết chương trình thực hiện yêu cầu sau:

  • 1. Định nghĩa một cấu trúc Sinh viên bao gồm các trường thông tin như sau: Mã Sinh viên (kiểu số nguyên), tên Sinh viên (kiểu chuỗi ký tự), lớp (kiểu chuỗi ký tự), điểm tổng kết (kiểu số thực), hạnh kiểm (Tốt, khá, trung bình, yếu).
  • 2. Cài đặt một cấu trúc danh sách kề cho kiểu dữ liệu Sinh viên, với các thao tác: 1) Khởi tạo danh sách; 2) kiểm tra rỗng, kiểm tra đầy 3) thêm phần tử 4) Tìm kiếm phần tử trong danh sách; 5) Xóa phần tử cuối cùng khỏi danh sách; 6) Duyệt danh sách.
  • 3. Chương trình chính: Sử dụng cấu trúc danh sách kề và các thao tác ở trên để:

– Nhập vào một danh sách liên kết kề gồm n Sinh viên (n bất kỳ).

– Hiển thị danh sách đã nhập ra màn hình.

-Liệt kê ra màn hình danh sách tất cả những Sinh viên thuộc lớp “D13CNPM”.

– Xóa phần tử cuối cùng khỏi danh sách.

Hiển thị lại danh sách sau khi xóa ra màn hình.

2.Xây dựng chương trình theo đề bài

#include<stdio.h>
#include<malloc.h>
#include <string.h>
struct sinhvien {
    int masv;
    char tensv[20];
    char lop[20];
    float dtk;
    char hk[15];
};

#define MAX 100
typedef struct DSKe{
    sinhvien A[MAX];
    int n;
}DSKe;

void KhoiTao (DSKe &ds){
    ds.n = 0;
}


int KiemTraRong (DSKe ds){
    if(ds.n==0)
        return 1;
    return 0;
}

int KiemTraDay (DSKe ds){
    if(ds.n== MAX)
        return 1;
    return 0;
}

void Nhap(DSKe &ds){
    printf ("Nhap so sinh vien = ");
    scanf ("%d",&ds.n);
    for (int i=0;i<ds.n;i++){
        printf ("Nhap ma sinh vien : ");fflush(stdin);
        scanf("%d",&ds.A[i].masv);
        printf ("Nhap ten sinh vien : ");fflush(stdin);
        gets(ds.A[i].tensv);
        printf ("Nhap lop : ");fflush(stdin);
        gets(ds.A[i].lop);
        printf ("Nhap diem tong ket : ");fflush(stdin);
        scanf("%f",&ds.A[i].dtk);
        printf ("Nhap hanh kiem : ");fflush(stdin);
        gets(ds.A[i].hk);
      printf ("\n \n");
    }

}

void DuyetDS (DSKe ds){
    printf ("%-20s %-20s %-15s %-20s %-15s\n","Ma sinh vien","Ho ten ","Lop","Diem tong ket","Hanh kiem");
    for (int i=0;i<ds.n;i++){
        printf ("%-20d %-20s %-15s %-20.2f %-15s\n",ds.A[i].masv,ds.A[i].tensv,ds.A[i].lop,ds.A[i].dtk,ds.A[i].hk);
    }
}

void TimKiem(DSKe ds){
    int p = 0, d = 0, B[10];
    while (p<ds.n){
        if (strcmp(ds.A[p].lop, "D13CNPM") == 0){
            B[d] = p;
            d++;
        }
        p += 1;
    }
    if (d>0){
        printf("\nDANH SACH SINH VIEN D13CNPM\n");
        printf ("%-20s %-20s %-15s %-20s %-15s\n","Ma sinh vien","Ho ten ","Lop","Diem tong ket","Hanh kiem");
        for (int i=0; i<d; i++)
            printf ("%-20d %-20s %-15s %-20.2f %-15s\n",ds.A[B[i]].masv,ds.A[B[i]].tensv,ds.A[B[i]].lop,ds.A[B[i]].dtk,ds.A[B[i]].hk);
    }
    else printf("Khong co phan tu can tim!\n");
}

void XoaPhanTuCuoi(DSKe &ds){
    //Dich chuyen
    for (int i=ds.n - 1; i<ds.n-1; i++)
        ds.A[i] = ds.A[i+1];
    ds.n = ds.n - 1;
}
int main (){
    DSKe ds;
    KhoiTao(ds);
    Nhap(ds);
    printf("\nDANH SACH SINH VIEN\n");
    DuyetDS(ds);
    TimKiem(ds);
    XoaPhanTuCuoi(ds);
    printf("\nDANH SACH SAU KHI XOA PHAN TU CUOI\n");
    DuyetDS(ds);
}