Code danh sách liên kết: sau khi nhập xong thông tin sinh viên thì không in ra được

e đang làm phần danh sách liên kết đơn mà code e thấy k sai đâu ạ, nhưng nhập xong nó k out được a ạ! trong struct SinhVien nếu e để 2 kiểu dữ liệu char và 2 kiểu int thì chạy ok, các a thử xem giúp e tại sao lại như vậy k ạ ! e cảm ơn ạ

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

//khai báo struct sinh viên
struct SinhVien {
    char HoTen[30];
    char MaSv[3];
    int Tuoi;
    char Lop[10];
};
typedef struct SinhVien SV;
//khai báo cấu trúc danh sách liên kết đơn
struct Node {
    SV data;
    struct Node *pNext;
};
typedef struct Node NODE;
//khai báo list
struct List {
    NODE *pHead;
    NODE *pTail;
};
typedef struct List LIST;
//khởi tạo danh dách liên kết đơn
void createlist (LIST *l) {
    l->pHead=l->pTail=NULL;
}
//tạo 1 node trong danh sách liên kết đơn
NODE* getnode (SV x) { //x là dữ liệu đưa vào data
    NODE *p=(NODE*)malloc(1*sizeof(NODE*));
    if (p==NULL) {
        return NULL;
    }
    p->data=x;
    p->pNext=NULL;
    return p;
}
//thêm node
//thêm cuối
void addtail (LIST *l, NODE *p) {
    if (l->pHead==NULL) { //khi trống
        l->pHead=l->pTail=p;
    } else {
        (*l).pTail->pNext=NULL;
        l->pTail=p;
    }
}
void AddHead(LIST *l, NODE *p)
{
	if(l->pHead == NULL) // Tức là danh sách bị rỗng
	{
		l->pHead = l->pTail = p;
	}
	else
	{
		p ->pNext = l->pHead; // p quăng dây để tham gia vào danh sách
		l->pHead = p; // p chính thức đã đứng dầu danh sách
	}
}
//nhập thông tin 1 sinh viên
void NhapThongTinSinhVien (SV *sv) {
    do {
        printf("\nHo Ten Sinh Vien: ");
        fflush(stdin);
        gets(sv->HoTen);
        if (strlen(sv->HoTen)>30)
            printf("\nDo dai ten nho hon 30 ki tu. Hay Nhap Lai");
    } while (strlen(sv->HoTen)>30);
    do {
        printf("\nMa So Sinh Vien: ");
        fflush(stdin);
        gets(sv->MaSv);
        if (strlen(sv->MaSv)>3)
            printf("\nDo dai MSSV nho hon 3 ki tu. Hay Nhap Lai");
    } while (strlen(sv->MaSv)>3);
    do {
        printf("\nTuoi: ");
        scanf("%d",&sv->Tuoi);
        if (sv->Tuoi<0) {
            printf("\nTuoi sai. Nhap lai");
        }
    } while (sv->Tuoi<0);
    do {
        printf("\nLop: ");
        fflush(stdin);
        gets(sv->Lop);
        if (strlen(sv->Lop)>10)
            printf("\nDo dai Lop nho hon 10 ki tu. Hay Nhap Lai");
    } while (strlen(sv->Lop)>10);
}
void XuatThongTinSinhVien (SV sv) {
    printf("\n%-15s %-10s %-10d %-10s",sv.HoTen,sv.MaSv,sv.Tuoi,sv.Lop);
}

//nhập dữ liệu cho danh sách
void Input (LIST *l,int n) {
    createlist(l);

    for (int i=0; i<n; i++) {
        SV x;
        printf("\nNhap Thong Tin Sinh Vien Thu %d",i+1);
        NhapThongTinSinhVien(&x);
        NODE *p=getnode(x);
        //addtail(l,p);
        AddHead(l,p);
    }
}
void Output (LIST l) {
    printf("\n%-15s %-10s %-10s %-10s","Ho Ten","Ma SV", "Tuoi", "Lop");
    for (NODE *p=l.pHead; p!=NULL; p=p->pNext) {
        XuatThongTinSinhVien(p->data);
    }
}
void GiaiPhong (LIST *l) {
    NODE *p; // Khai báo Node p.
    while(l->pHead != NULL) {
        p = l->pHead;
        l->pHead = (*l).pHead ->pNext;
        free(p);
    }
}
int main() {
    LIST l;
    int n;
    printf("\nNhap So Sinh Vien: ");
    scanf("%d",&n);
    Input(&l,n);
    Output(l);
    GiaiPhong(&l);
    return 0;
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?