30/09/2018, 19:30

[Hỏi] 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 ạ

đ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("
	PHIEU NHAP THONG TIN SINH VIEN.

");
        printf("Sinh vien %d:
",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("
 Tiep tuc(Y)
 Thoat(N
");
        fflush(stdin);
        printf(" Dap an cua ban: ");
        tl = getchar();
    }while(tl != 'n');
}

void xuat(){
    int i=0;
    
    printf("
	DANH SACH SINH VIEN

");
    printf("STT Ho ten	Tuoi	Diem TB
");
    p = first;
    while(p != NULL){
        printf("%2d  %s	%d	%.2f
",++i,p->hten,p->tuoi,p->diemTB);
        p = p->link;
    }
    
}
 
int main(){
    char tl;
    do{
        fflush(stdin);
        printf("
	DANH SACH SINH VIEN");
        printf("

	MENU:
");
        printf("
 Phim 1. Nhap danh sach.");
        printf("
 Phim 2. In danh sach.");
        printf("
 Phim 3. Them sinh vien(Them sau)");
        printf("
 Phim 4. Thoat.");
        printf("

 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
");break;
            default : printf("Phim ban chon khong dung. Vui long thu lai.
");
                
                break;
        }
    }while(tl!='4');
}
Vu Van Chung viết 21:36 ngày 30/09/2018

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

Gia Sư Tin Học viết 21:42 ngày 30/09/2018

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

nguyen tuan viết 21:41 ngày 30/09/2018

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 à.

Việt Dũng Lê viết 21:42 ngày 30/09/2018

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

Bài liên quan
0