Cách dùng con trỏ trong Struct (Ngôn ngữ C)

Chào anh chị và các bạn trên diễn đàn , em đang làm bài tập quản lý sinh viên sử dụng Struct trong C , có đoạn code này em nghĩ mãi không hiểu ý nghĩa của nó là gì , em post code lên mong anh chị và các bạn giải thích giúp em ạ :smile:

đoạn code em không hiểu được ý nghĩa của chúng nằm trong hàm taoDS đó là :

last->link = p;
last = p;

mong các anh chị và các bạn giải nghĩa giúp em ý nghĩa của chúng ạ
và đây là code của cả bài ạ

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct sinhVien{
    char hten[30];
    int tuoi;
    float diemTB;
    struct sinhVien *link;
}p_sv;

p_sv *first, *last, *p;

void taoDS(){
    char ht[30],tl;
    int i=0,tuoi;
    float dtb;
    first = NULL;
    do{
        
        printf("\n\tPHIEU NHAP THONG TIN SINH VIEN.\n\n");
        printf("Sinh vien %d:\n",i+1);
        printf(" Ho ten: ");
        fflush(stdin);
        gets(ht);
        printf(" Tuoi: ");
        scanf("%d",&tuoi);
        printf(" Diem TB: ");
        scanf("%f",&dtb);
        fflush(stdin);
        p = (p_sv *)malloc(sizeof(p_sv));
        strcpy(p->hten,ht);
        p->diemTB = dtb; 	p->tuoi = tuoi;
        if(first == NULL){
            first = p;
            last = p;
        }else{
            last->link = p;
            last = p;
        }
        p->link = NULL;
        i++;
        printf("\n Tiep tuc(Y)\n Thoat(N\n");
        fflush(stdin);
        printf(" Dap an cua ban: ");
        tl = getchar();
    }while(tl != 'n');
}

void xuat(){
    int i=0;
    
    printf("\n\tDANH SACH SINH VIEN\n\n");
    printf("STT Ho ten\tTuoi\tDiem TB\n");
    p = first;
    while(p != NULL){
        printf("%2d  %s\t%d\t%.2f\n",++i,p->hten,p->tuoi,p->diemTB);
        p = p->link;
    }
    
}
 
int main(){
    char tl;
    do{
        fflush(stdin);
        printf("\n\tDANH SACH SINH VIEN");
        printf("\n\n\tMENU:\n");
        printf("\n Phim 1. Nhap danh sach.");
        printf("\n Phim 2. In danh sach.");
        printf("\n Phim 3. Them sinh vien(Them sau)");
        printf("\n Phim 4. Thoat.");
        printf("\n\n Ban chon: ");
        tl = getchar();
        fflush(stdin);
        switch(tl){
            case '1': taoDS();	 	break;
            case '2': xuat();		break;
            case '3': themSau(); 	break;
            case '4': printf("Cam on da su dung chuong trinh. Goodbye\n");break;
            default : printf("Phim ban chon khong dung. Vui long thu lai.\n");
                
                break;
        }
    }while(tl!='4');
}

struct sinhVien của bạn gồm các thuộc tính hTen, tuoi, diemTB và một con trỏ link trỏ đến một node khác kiểu sinhVien, khi thêm một sv mới, hàm của bạn kiểm tra first có trỏ đến null không? nếu nó trỏ đến null nghĩa là chưa có node nào thì chỉ việc thêm, còn nếu nó != null thì nghĩa là danh sách khác rỗng, khi bạn thêm một node mới vào cuối thì cái last phải trỏ đến node mới này. Nghĩa là giải sử last đang trỏ tới node node1, bây giờ thêm node mới thì node1 phải trỏ tới newNode, do đó last->link = p chính là làm thao tác này, còn last = p là để gán lại con trỏ đuôi, vì lúc này phần tử cuối cùng là newNode nên last phải trỏ vào phần tử mới này

3 Likes

Để hiểu thêm về struct bạn có thể xem bài giảng struct trong c

2 Likes

Ngày trước học CSDL & GT đến phần danh sách liên kết đơn cũng không hiểu chỗ này y hệt bạn. Câu trả lời thì bạn @VuVanChung đã trả lời rất rõ rồi, nếu vẫn chưa hiểu bạn lên youtube tìm danh sách liên kết đơn là hiểu ngay à.

1 Like

em cám ơn các anh đã giúp đỡ em ạ
em đi học bận quá giờ mới lên mạng được , 1 lần nữa cho em cám ơn các anh :smile:

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