0% found this document useful (0 votes)
14 views10 pages

DSA - Linked List

hii

Uploaded by

nguyenductoan136
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
14 views10 pages

DSA - Linked List

hii

Uploaded by

nguyenductoan136
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

#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);

You might also like