#include<iostream>
#include<fstream>
using namespace std;
struct sinhvien
{
int MSSV;
char Hoten[30];
};
typedef struct sinhvien SINHVIEN;
struct node
{
SINHVIEN data;
struct node *pNext;
};
typedef struct node NODE;
struct list
{
NODE *pHead;
NODE *pTail;
};
typedef struct list LIST;
NODE *Khoi_tao_node(SINHVIEN sv)
{
NODE *p = new NODE;
if (p == NULL)
{
cout << "Khong du bo nho de cap phat.\n"; return NULL;
}
else
{
p->data = sv;
p->pNext = NULL;
return p;
}
}
void Khoi_tao_danh_sach(LIST &l)
{
l.pHead = NULL;
l.pTail = NULL;
}
void Them_vao_dau_danh_sach(LIST &l, NODE *p)
{
if (l.pHead == NULL)
{
l.pHead = l.pTail = p;
}
else
{
p->pNext = l.pHead;
l.pHead = p;
}
}
void Them_vao_cuoi_danh_sach(LIST &l, NODE *p)
{
if (l.pHead == NULL)
{
l.pHead = l.pTail = p;
}
else
{
l.pTail->pNext = p;
l.pTail = p;
}
}
void Nhap_du_lieu(SINHVIEN &sv)
{
//cin.ignore();
}
void Xuat_du_lieu_1_sinh_vien(SINHVIEN sv)
{
cout << "MSSV: " << sv.
MSSV << endl
; cout << "Ho ten: " << sv.
Hoten << endl
; }
void Xuat_danh_sach(LIST l)
{
int dem = 1;
for (NODE *k = l.pHead; k != NULL; k = k->pNext)
{
cout << "\tSINH VIEN THU " << dem
++ << endl
; Xuat_du_lieu_1_sinh_vien(k->data);
}
}
int Reccount(LIST l)
{
int dem = 0;
for (NODE *k = l.pHead; k != NULL; k = k->pNext)
{
dem++;
}
return dem;
}
void Them_sv_x_vao_sau_sv_thu_i(LIST &l)
{
cout << "\nNhap du lieu sinh vien can them: " << endl
; SINHVIEN x;
Nhap_du_lieu(x);
NODE *p = Khoi_tao_node(x);
int i;
cout << "Nhap vi tri can them vao sau: "; do
{
if (i < 0)
{
cout << "Vi tri khong hop le. Xin nhap lai\n"; cout << "Nhap lai vi tri: "; }
}while (i < 0);
if (i == 0)
{
Them_vao_dau_danh_sach(l,p);
}
else if (0 < i < Reccount(l))
{
int dem = 0;
for (NODE *k = l.pHead; k != NULL; k = k->pNext)
{
dem++;
if (dem == i)
{
NODE *h = Khoi_tao_node(p->data);
h->pNext = k->pNext;
k->pNext = h;
}
}
}
else
{
Them_vao_cuoi_danh_sach(l,p);
}
}
void Tim_kiem_theo_MSSV(LIST l)
{
int MS;
cout << "Nhap ma so sinh vien can tim kiem: "; for (NODE *k = l.pHead; k != NULL; k = k->pNext)
{
if (k->data.MSSV == MS)
{
cout << "\tTHONG TIN SINH VIEN\n"; Xuat_du_lieu_1_sinh_vien(k->data);
}
}
}
void Sap_xep_theo_MSSV(LIST l)
{
for (NODE *k = l.pHead; k->pNext != NULL; k = k->pNext)
{
for (NODE *g = k->pNext; g != NULL; g = g->pNext)
{
if(k->data.MSSV > g->data.MSSV)
{
SINHVIEN t = k->data;
k->data = g->data;
g->data = t;
}
}
}
}
void Xoa_dau_danh_sach(LIST &l)
{
if (l.pHead == NULL)
{
return;
}
else
{
NODE *p = l.pHead;
l.pHead = l.pHead->pNext;
delete p;
}
}
void Xoa_cuoi_danh_sach(LIST &l)
{
if (l.pHead == NULL)
{
return;
}
else if (l.pHead == l.pTail)
{
Xoa_dau_danh_sach(l);
}
else
{
for (NODE *k = l.pHead; k != NULL; k = k->pNext)
{
if (k->pNext == l.pTail)
{
delete l.pTail;
k->pNext = NULL;
l.pTail = k;
return;
}
}
}
}
void Xoa_1_sinh_vien_theo_MSSV(LIST &l, int MS)
{
if (l.pHead->data.MSSV == MS)
{
Xoa_dau_danh_sach(l);
}
if (l.pTail->data.MSSV == MS)
{
Xoa_cuoi_danh_sach(l);
}
NODE *g = new NODE;
for (NODE *k = l.pHead; k != NULL; k = k->pNext)
{
if (k->data.MSSV == MS)
{
g->pNext = k->pNext;
delete k;
}
g = k;
}
}
void Xoa_du_lieu(LIST &l)
{
NODE *k = NULL;
while (l.pHead != NULL)
{
k = l.pHead;
l.pHead = l.pHead->pNext;
delete k;
}
}
bool IsEmpty(LIST l)
{
if (l.pHead == NULL)
{
return true;
}
else
{
return false;
}
}
void Ghi_file(LIST l, ofstream &Fileout)
{
for (NODE *k = l.pHead; k != NULL; k = k->pNext)
{
Fileout.write((char *)&(k->data), sizeof(k->data));
}
}
void Doc_thong_tin_1_sv(SINHVIEN &x, ifstream &Filein)
{
Filein.read((char *)(&x), sizeof(x));
}
void Doc_file(LIST &l, ifstream &Filein)
{
if (IsEmpty(l) == false)
{
Xoa_du_lieu(l);
}
while (Filein.eof() == false)
{
SINHVIEN x;
Doc_thong_tin_1_sv(x, Filein);
NODE *p = Khoi_tao_node(x);
Them_vao_cuoi_danh_sach(l,p);
}
}
void Menu(LIST &l)
{
int luachon;
while(true)
{
system("cls");
cout << "\t\tQUAN LY SINH VIEN\n"; cout << "\t1.Nhap du lieu sinh vien.\n"; cout << "\t2.Xuat danh sach sinh vien.\n"; cout << "\t3.Them 1 sinh vien vao dau danh sach.\n"; cout << "\t4.Tong so sinh vien hien tai.\n"; cout << "\t5.Them 1 sinh vien vao sau sinh vien thu i.\n"; cout << "\t6.Tim kiem sinh vien theo ma so.\n"; cout << "\t7.Xoa sinh vien khoi danh sach.\n"; cout << "\t8.Sap xep sinh vien tang dan theo ma so.\n"; cout << "\t9.Ghi file.\n"; cout << "\t10.Doc file.\n"; cout << "\t0.Ket thuc.\n"; cout << "\t===========================\n"; cout << "Nhap lua chon: "; do
{
if (luachon < 0 || luachon > 10)
{
cout << "Lua chon khong hop le. Xin nhap lai.\n"; cout << "Nhap lai lua chon: "; }
}while(luachon < 0 || luachon > 10);
if (luachon == 1)
{
cout << "\tNHAP THONG TIN SINH VIEN\n"; SINHVIEN x;
Nhap_du_lieu(x);
NODE *p = Khoi_tao_node(x);
Them_vao_cuoi_danh_sach(l,p);
}
else if (luachon == 2)
{
cout << "\t\tDANH SACH SINH VIEN\n"; Xuat_danh_sach(l);
system("pause");
}
else if (luachon == 3)
{
cout << "\tNHAP THONG TIN SINH VIEN CAN THEM\n"; SINHVIEN x;
Nhap_du_lieu(x);
NODE *p = Khoi_tao_node(x);
Them_vao_dau_danh_sach(l,p);
}
else if (luachon == 4)
{
cout << "Tong so sinh vien hien tai: " << Reccount
(l
); system("pause");
}
else if (luachon == 5)
{
Them_sv_x_vao_sau_sv_thu_i(l);
}
else if (luachon == 6)
{
Tim_kiem_theo_MSSV(l);
system("pause");
}
else if (luachon == 7)
{
int x;
cout << "Nhap ma so sinh vien can xoa: "; char t;
cout << "Ban that su muon xoa (Y/N)? "; if (t == 89 || t == 121)
{
Xoa_1_sinh_vien_theo_MSSV(l,x);
}
}
else if (luachon == 8)
{
Sap_xep_theo_MSSV(l);
}
else if (luachon == 9)
{
ofstream Fileout;
Fileout.open("D:\\CNTT\\C++\\CTDL>\\Chuong 4\\DSSV.dat", ios_base::out | ios_base::binary);
Ghi_file(l, Fileout);
Fileout.close();
}
else if (luachon == 10)
{
ifstream Filein;
Filein.open("D:\\CNTT\\C++\\CTDL>\\Chuong 4\\DSSV.dat", ios_base::in | ios_base::binary);
if (Filein.fail() == true)
{
cout << "File khong ton tai.\n"; system("pause");
}
else
{
Doc_file(l, Filein);
}
Filein.close();
}
else
{
break;
}
}
}
int main()
{
LIST l;
Khoi_tao_danh_sach(l);
Menu(l);
system("pause");
return 0;
}