#include <iostream>
#include <vector>
#include<string>
using namespace std;
typedef struct SinhVien {
string mssv;
string name;
double dtb;
void Nhap() {
cout << "Nhap ho ten sinh vien: ";
getline(cin, name);
cout << "\nNhap ma so sinh vien: ";
getline(cin, mssv);
cout << "\nNhap diem trung binh: ";
cin >> dtb;
cin.ignore();
cout << "\n";
void Xuat() {
cout << "Ho ten: " << name << "\n"
<< "Ma so sinh vien: " << mssv << "\n"
<< "Diem trung binh: " << dtb << "\n";
bool operator!=(const SinhVien& other) const {
return this->mssv != other.mssv;
}SV;
typedef struct tagNode {
SV Info;
struct tagNode* Next;
}Node;
typedef struct taglist {
Node* Head;
Node* Tail;
}list;
void CreateList(list& I);
Node* Create();
void Print(list I);
void AddHead(list& I, Node* p);
void IsInClass(list& I);
int RemoveHead(list& I, string& x);
int RemoveAfterQ(list& I, Node* q, string& x);
int RemoveX(list& I, string& x);
void LietKeDTB (list I);
void Xeploai(list I);
void SelectionSort(list& I);
void InsertAfterQ(list& I, Node* p, Node* q);
void InsertNode(list& I);
int main()
// Yeu cau 1: Khai bao DSLK
list a;
CreateList(a);
int n;
int sl = 0;
// Yeu cau 2: Nhap danh sach cac sinh vien
// va them tung sinh vien vao dau danh sach
while(1) {
Node* p;
cout << "Nhap thong tin cua sinh vien thu " << sl + 1 << ": \n";
p = Create();
if (p->Info.name == " ") break;
AddHead(a, p);
sl++;
Print(a);
// Yeu cau 3: Tim mot sinh vien co trong lop hoc
IsInClass(a);
// Yeu cau 4: Xoa mot sinh vien co MSSV bang x
SV x;
cout << "Nhap mssv cua sinh vien muon xoa khoi danh sach: ";
getline(cin, x.mssv);
cout << "\n";
RemoveX(a, x.mssv);
cout << "Danh sach sinh vien sau khi xoa: \n";
Print(a);
// Yeu cau 5: Liet ke thong tin cua cac sinh vien co dtb >= 5
LietKeDTB(a);
// Yeu cau 6: Xep loai va in ra thong tin cua tung sinh vien
Xeploai(a);
// Yeu cau 7: Sap xep va in ra danh sach sinh vien tang theo diem trung binh
SelectionSort(a);
cout << "Danh sach sinh vien co dtb tang dan: \n";
Print(a);
// Yeu cau 8: Chen mot sinh vien vao danh sach sinh vien tang theo diem trung
// binh tren, sao cho sau khi chen danh sach sinh vien van tang theo dtb
InsertNode(a);
cout << "Danh sach sinh vien sau khi chen: \n";
Print(a);
return 0;
void CreateList(list& I) {
I.Head = NULL;
I.Tail = NULL;
Node* Create() {
SV x;
x.Nhap();
Node* p;
p = new Node;
if (p == NULL) exit(1);
p->Info = x;
p->Next = NULL;
return p;
void Print(list I) {
Node* p;
p = I.Head;
while (p != NULL) {
p->Info.Xuat();
p = p->Next;
void AddHead(list& I, Node* p) {
if (I.Head == NULL) {
I.Head = p;
I.Tail = I.Head;
else {
p->Next = I.Head;
I.Head = p;
void IsInClass(list& I) {
cout << "Nhap thong tin cua sinh vien muon tra cuu:\n";
SV x;
x.Nhap();
Node* p;
p = I.Head;
while (p != NULL && p->Info != x) {
p = p->Next;
if (p == NULL) cout << "Khong co sinh nay trong danh sach lop!\n";
else {
cout << "Sinh vien nay co trong danh sach lop! => Thong tin:\n";
p->Info.Xuat();
int RemoveHead(list& I, string& x) {
Node* p;
if (I.Head != NULL) {
p = I.Head;
x = p->Info.mssv;
I.Head = I.Head->Next;
delete p;
if (I.Head == NULL) I.Tail = NULL;
return 1;
return 0;
int RemoveAfterQ(list& I,Node* q, string& x) {
Node* p;
if (q != NULL) {
p = q->Next;
if (p != NULL) {
if (p == I.Tail)
I.Tail = q;
q->Next = p->Next;
x = p->Info.mssv;
delete p;
return 1;
else return 0;
}
int RemoveX(list& I, string& x) {
Node* p, * q = NULL;
p = I.Head;
while (p != NULL && p->Info.mssv != x) {
q = p;
p = p->Next;
if (p == NULL) {
cout << "Khong co sinh vien nay trong danh sach lop! \n";
return 0;
if (q != NULL)
RemoveAfterQ(I, q, x);
else RemoveHead(I, x);
return 1;
void LietKeDTB (list I) {
Node* p;
p = I.Head;
int index = 0;
cout << "Danh sach sinh vien co dtb >= 5: \n";
while (p->Info.dtb >= 5 && p != NULL) {
p->Info.Xuat();
p = p->Next;
index++;
if (index == 0) cout << "Khong co sinh vien nao co dtb >= 5. \n";
}
void Xeploai(list I) {
Node* p;
p = I.Head;
cout << "Xep loai sinh vien trong Truong: \n";
while (p != NULL) {
p->Info.Xuat();
if (p->Info.dtb > 10);
else if (p->Info.dtb >= 9)
cout << "Sinh vien loai XUAT SAC!!\n";
else if (p->Info.dtb >= 8)
cout << "Sinh vien loai GIOI!!\n";
else if (p->Info.dtb >= 7)
cout << "Sinh vien loai KHA!!\n";
else if (p->Info.dtb >= 6.5)
cout << "Sinh vien loai TRUNG BINH KHA!!\n";
else if (p->Info.dtb >= 5)
cout << "Sinh vien loai TRUNG BINH!!\n";
else if (p->Info.dtb >= 3.6)
cout << "Sinh vien loai YEU!!\n";
else if (p->Info.dtb >= 0)
cout << "Sinh vien loai KEM!!\n";
p = p->Next;
void SelectionSort(list& I) {
Node* p, *q, *min;
p = I.Head;
for (; p != I.Tail; p = p->Next) {
min = p;
for (q = p->Next; q != NULL; q = q->Next) {
if (q->Info.dtb < p->Info.dtb) min = q;
swap(min->Info, p->Info);
void InsertAfterQ(list& I, Node* p, Node* q) {
if (q != NULL) {
p->Next = q->Next;
q->Next = p;
if (I.Tail == q) I.Tail = p;
else AddHead(I, p);
void InsertNode(list& I) {
Node* p = I.Head, * q = NULL;
Node* newNode = Create();
if (p == NULL || newNode->Info.dtb < p->Info.dtb) {
AddHead(I, newNode);
return;
while (p != NULL && p->Info.dtb < newNode->Info.dtb) {
q = p;
p = p->Next;
InsertAfterQ(I, newNode, q);