Hỏi đáp về danh sách liên kết thuận

em có 1 bài dslk thuận về quản lí sinh viên. em đang vướng 1 chỗ đó là ở hàm hienThi1SinhVien ở mục 7 em muốn in ra cái số thứ tự của sinh viên đó, số thứ tự em dùng trong hàm inDanhSach ở mục 2 thì có cách nào in ra đc stt của sinh viên đó ạ, các bác giúp em với ạ.
em gửi đề và code ạ

Viết chương trình tạo ra một danh sách liên kết thuận để quản lý danh sách sinh viên.
Cấu trúc sách gồm các thành phần: mã sv, tên sv, tuổi, que quán, diemTB. Chương trình được tổ chức thành các chương trình con sau:

  1. Tạo danh sách sách
  2. Hiển thị danh sách ra màn hình theo dạng
  3. Sắp xếp sách giảm dần theo ma SV
  4. Xóa một sv nào đó với tên sv nhập vào từ bàn phím
  5. Thêm một sv vào sau một sv
  6. Sửa thông tin một sinh vien nhập từ bàn phím
  7. Hiển thị thông tin một sinh viên (tên được nhâp từ bàn phim)
  8. Hiển thị các sinh viên có điểm TB>= 1 điểm nhập từ bàn phím
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
    char maSV[10];
    char ho_ten[15];
    int tuoi;
    char que_quan[15];
    float diemTB;
}thongtin;

typedef struct node
{
    thongtin data;
    struct node *next;
}Node;

Node *first = NULL;
Node *last = NULL;

thongtin nhapThongTin()
{
    thongtin tt;
    printf("Nhap ma sinh vien: ");
    fflush(stdin);
    gets(tt.maSV);

    printf("Nhap ho ten sinh vien: ");
    fflush(stdin);
    gets(tt.ho_ten);

    printf("Nhap tuoi: ");
    scanf("%d", &tt.tuoi);

    printf("Nhap que quan: ");
    fflush(stdin);
    gets(tt.que_quan);
    printf("Nhap diem trung binh: ");
    scanf("%f",&tt.diemTB);
    return tt;
}

Node *taoVaCapPhatNode()
{
    Node *p = (Node*)malloc(sizeof(Node));
    if(p==NULL)
    {
        printf("Cap phat that bai");
        return NULL;
    }
    p->data = nhapThongTin();
    p->next = NULL;
    return p;
}

void chenNode(Node *p)
{
    if(first == NULL)
    {
        first = p;
        last = p;
    }
    else
    {
        last->next = p;
        last = p;
    }
    return p;
}

Node *timNode()
{
    char hoTenCanTim[15];
    fflush(stdin);
    gets(hoTenCanTim);
    for(Node *p = first; p!=NULL; p=p->next)
    {
        if(strcmp(hoTenCanTim,p->data.ho_ten)==0)
            return p;
    }
    printf("Khong tim thay sinh vien theo yeu cau!\n");
    return NULL;
}

void xoaToanBoDanhSachCu()
{
    if(first = NULL)
    {
        return;
    }
    for(Node* k=first;k!=NULL;k=k->next)
    {
        Node* p = first;
        first = p->next;
        free(p);
    }
    last=NULL;

}
void taoDanhSach()
{
    int i=1;
    while(1)
    {
        printf("\t\tNHAP THONG TIN SINH VIEN THU %d\n",i);
        i++;
        Node *p = taoVaCapPhatNode();
        chenNode(p);
        printf("\tBan co muon nhap tiep khong ?\n");
        printf("\tYES(Y)\t NO(N)\n");
        printf("Moi ban chon: ");
        fflush(stdin);
        char cs = getchar();
        if(cs == 'N' || cs == 'n')
            break;
        printf("\n");
    }

}

void sapXepSinhVienTheoDiem()
{
    for(Node *i = first; i->next!=NULL; i=i->next)
    {
        for(Node *j = i->next; j!=NULL; j=j->next)
        {
            if(j->data.diemTB > i->data.diemTB)
            {
                thongtin tmp;
                tmp=j->data;
                j->data = i->data;
                i->data = tmp;
            }
        }
    }
    printf("Da sap xep thanh cong!\n");
    return;
}
void inDanhSach()
{
    int stt=1;
    Node *p = first;
    printf("\tDANH SACH SINH VIEN\n");
    printf("%5s%10s%25s%10s%15s%10s\n","STT","Ma SV","Ho ten","Tuoi","Que Quan" ,"Diem TB");
    while(p!= NULL)
    {
        printf("%5d%10s%25s%10d%15s%8.2f\n",stt,p->data.maSV,p->data.ho_ten,p->data.tuoi,p->data.que_quan,p->data.diemTB);
        stt++;
        p=p->next;
    }

}

void xoa1SinhVien()
{
    printf("Nhap ten sinh vien can xoa: ");
    Node* p = timNode();
    if(p==NULL)
        return;
    if(p==first)
    {
        first = p->next;
        free(p);
        return;
    }
    if(p==last)
    {
       Node* k = first;
        while(k->next!=last)
        {
            k=k->next;
        }
        free(last);
        last = k;
        k->next = NULL;
        return;
    }
    Node *k = first;
    while(k->next !=p)
    {
        k=k->next;
    }
    k->next = p->next;
    free(p);
    printf("\n\tDa xoa thanh cong !!");
}

void themMotSV()
{
    printf("Ban muon them sinh vien dang sau sinh vien nao?\n ");
    printf("Moi nhap ten sinh vien: ");
    Node *p = timNode();
    if(p == NULL)
    {
       return;
    }
    printf("Nhap thong tin sinh vien muon them: \n");
    Node *k = taoVaCapPhatNode();
    if(k== last)
    {
        last->next = k;
        last =k;
    }
    else
    {
        k->next = p->next;
        p->next = k;
    }
    printf("Da them sinh vien thanh cong !!\n");
}
void suaThongTinSV()
{
    printf("Nhap ho ten SV can sua: ");
    Node *p = timNode();
    if(p== NULL)
        return;
    p->data = nhapThongTin();
    printf("\n");
    printf("Sua thong tin thanh cong!!\n");
}

void inSinhVienTheoDiem()
{
    float diem;
    printf("Moi nhap diem muon tim kiem: ");
    scanf("%f",&diem);

    printf("\tDANH SACH SINH VIEN\n");
    printf("%5s%10s%25s%10s%15s%10s\n","STT","Ma SV","Ho ten","Tuoi","Que Quan" ,"Diem TB");
    int stt=1;
    for(Node* p = first;p!=NULL;p=p->next)
    {
        if(p->data.diemTB >= diem)
        {
            printf("%5d%10s%25s%10d%15s%8.2f\n",stt,p->data.maSV,p->data.ho_ten,p->data.tuoi,p->data.que_quan,p->data.diemTB);
            stt++;
        }
    }
}

void hienThi1SinhVien()
{
    Node *p = timNode();
    if(p == NULL)
    {
        return;
    }
    printf("%5s%10s%25s%10s%15s%10s\n","STT","Ma SV","Ho ten","Tuoi","Que Quan" ,"Diem TB");
    printf("\n");
 //   printf("%5d%10s%25s%10d%15s%8.2f\n",,p->data.maSV,p->data.ho_ten,p->data.tuoi,p->data.que_quan,p->data.diemTB);

}

void menu()
{
    printf("\t\tMENU\n");
    printf("\t1) Tao danh sach\n");
    printf("\t2) Hien thi danh sach\n");
    printf("\t3) Sap xep danh sach giam dan theo diem TB\n");
    printf("\t4) Xoa sinh vien\n");
    printf("\t5) Them sinh vien\n");
    printf("\t6) Sua thong tin sinh vien\n");
    printf("\t7) Hien thi thong tin mot sinh vien\n");
    printf("\t8) Hien thi cac sinh vien co diem TB lon hon so nhap tu ban phim\n");
    printf("\t0) Ket thuc\n");
}
int main()
{

    while(1)
    {
        menu();
        int choose;
        printf("Moi ban chon: ");
        scanf("%d",&choose);
        switch(choose)
        {
        case 1:
            xoaToanBoDanhSachCu();
            taoDanhSach();
            printf("Bam phim bat ki de tro ve menu: ");
            getchar();
            break;
        case 2:

            inDanhSach();
            printf("\nBam phim bat ki de tro lai menu:");
            getchar();
            break;
        case 3:
            printf("Ban da chon sap xep diem giam dan!\n ");
            sapXepSinhVienTheoDiem();
            printf("\nBam phim bat ki de tro lai menu: ");
            getchar();
            break;
        case 4:
            printf("Ban da chon xoa 1 sinh vien!\n");
            xoa1SinhVien();
            printf("\nBam phim bat ki de tro lai menu: ");
            getchar();
            break;
        case 5:
            printf("Ban da chon them 1 sinh vien1!\n");
            themMotSV();
            printf("\nBam phim bat ki de tro lai menu: ");
            getchar();
            break;
        case 6:
            printf("Ban da chon sua sinh vien!\n");
            suaThongTinSV();
            printf("\nBam phim bat ki de tro lai menu: ");
            getchar();
            break;
        case 8:
            printf("Ban da chon in sinh vien co diem lon hon so nhap tu ban phim!\n");
            inSinhVienTheoDiem();
            printf("\nBam phim bat ki de tro lai menu: ");
            getchar();
            break;
        case 0:
            printf("Bye!");
            return;
        default:
            printf("\n\tBan chi duoc chon tu 0 -> 8");
            printf("\n\tBam phim bat ki de tro lai menu:");
            break;
        }
        getchar();
        system("cls");
    }
}
1 Like

Nếu vậy chắc bạn cần overloading thêm 1 hàm tìm Node khác nữa

Node *timNode(int& stt)
{
    // tìm node và trả về stt thông qua tham số
}
3 Likes

Bác nói rõ cho em hiểu đc không ạ, cái stt nó là tham số ở 1 hàm khác nên em còn hơi mơ hồ

void hienThi1SinhVien()
{
    int stt = -1;
    Node *p = timNode(stt);
    if(p == NULL)
    {
        return;
    }
    cout << stt << endl;
}

Nghĩa là sau khi overload hàm timNode thì bạn có thể sử dụng như vậy

3 Likes

cảm ơn bác để em thử

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