Không thêm được vào cuối danh sách liên kết đơn

Em chào mọi người ạ. Mọi người có thể giúp em lỗi nay được không ạ. Ở hàm ‘themsv’ em thêm 1 sinh viên vào cuối danh sách nhưng khi xuất ra nó không hiện gì ạ. Mong mọi người giải đáp giúp em ạ.

Đề bài : Dùng danh sách liên kết đơn để nhập thông tin sinh viên và xuất danh sách đã nhập. Thêm vào cuối danh sách thông tin 1 sinh viên.

#include <iostream>
using namespace std;

struct Sinhvien
{
    int sbd;
    string ten;
    float diem;
    Sinhvien *next;
};

struct Danhsach
{
    Sinhvien *head;
    Sinhvien *tail;
};

void createlist(Danhsach &l)
{
    l.head = NULL;
    l.tail = NULL;
}

Sinhvien *addsv(int number, string name, float score)
{
    Sinhvien *p = new Sinhvien;
    p->sbd = number;
    p->ten = name;
    p->diem = score;
    p->next = NULL;
    return p;
}

void addhead(Danhsach &l, Sinhvien *p)
{
    if(l.head == NULL) l.head = p;
    else
    {
        p->next = l.head;
        l.head = p;
    }
}

void addtail(Danhsach &l, Sinhvien *p)
{
    if(l.head == NULL)
    {
        l.head = p;
        l.tail = p;
    }
    else
    {
        l.tail->next = p;
        l.tail = p;
    }
}

void nhap(Danhsach &l, int n)
{
    int sbd;
    float diem;
    string ten;
    for(int i=0;i<n;i++)
    {
        cout<<"Nhap SBD: "; cin>>sbd; 
        cin.ignore();
        cout<<"Nhap ten: "; getline(cin, ten);
        cout<<"Diem: "; cin>>diem;
        Sinhvien *p = addsv(sbd,ten,diem);
        addhead(l,p);
    }
}

void xuat(Danhsach l)
{
    cout<<"Hien thi danh sach:"<<endl;
    for(Sinhvien *q = l.head; q!=NULL; q = q->next)
    {
        cout<<q->sbd<<"\t"<<q->ten<<"\t"<<q->diem<<endl;
    }
}

void themsv(Danhsach l)
{
    int sbd;
    string ten;
    float diem;
    cout<<"Cho SV can them vao cuoi DS:";
    cout<<"\nSBD: "; cin>>sbd; 
    cin.ignore();
    cout<<"Ten: "; getline(cin, ten);
    cout<<"Diem: "; cin>>diem;
    Sinhvien *k = addsv(sbd,ten,diem);
    addtail(l,k);
    xuat(l);
}

int main()
{
    Danhsach l;
    createlist(l);

    int n;
    do
    {
        cout<<"Cho n = "; cin>>n;
    } while (n<=0);
    nhap(l,n);
    xuat(l);
    themsv(l);
    return 0;
}
void addhead(Danhsach &l, Sinhvien *p)
{
    if(l.head == NULL) l.head = p;
    else
    {
        p->next = l.head;
        l.head = p;
    }
}

Có vẻ do trong hàm này bạn chưa update con trỏ tail cho mỗi sinh viên được add vào. Bạn làm lại hàm addhead rồi share kết quả xem thế nào.

Mình sửa hàm addhead này lại thì thấy kết quả in ra bình thường.

Cho n = 2
Nhap SBD: 1
Nhap ten: 1
Diem: 1
Nhap SBD: 2
Nhap ten: 2
Diem: 2
Hien thi danh sach:
2	2	2
1	1	1
Cho SV can them vao cuoi DS:
SBD: 3
Ten: 3
Diem: 3
Hien thi danh sach:
2	2	2
1	1	1
3	3	3
3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?