DANH SÁCH LIÊN KẾT QUẢN LÝ SINH VIÊN
chú y: Ký tu > và < thay bằng [ ]
vì web ko nhận được// Khai báo tiền xử lý
#include”iostream.h” //Dòng nhập xuất cin cout
#include”string.h” // khai báo khi dùng memcpy
#include”conio.h” // khai báo khi dùng getch() xóa màn hình
//Quản lý danh sách Sinh viên, thì ta quản lý về họ tên,MSSV, diem,ngày sinh….
//mình chỉ làm ví dụ 3 thông tin về họ tên, điểm, MSSV
//đầu tiên khai báo một struct Điểm vì có nhiều môn học
typedef struct
{
int Toan;
int Ly;
int Hoa;
}DIEM;
//struct được quan niệm như một kiễu dữ liệu do mình định nghĩa
//Tiếp đến khai báo struct SINHVIEN chứa 3 thông tin trên
typedef struct
{
char Hoten[30];
int MASSV;
DIEM diem; // cấu trúc struct lồng nhau DIEM trong SINHVIEN
}SINHVIEN;
//một danh sách liên kết bao gồm nhiều Nút
//Với bài này một nút là thông tin của 1 sinh viên
// Một nút (hay NODE) gồm có 2 phần, 1 chứa dữ liệu
//và một phần để liên kết với nút tiếp theo
template[class T]
struct NODE
{
T data;
NODE *next;
};
//Khai báo 1 class List
template [class T]
class List
{
private:
//một danh sách thông thường có 3 con trỏ
// một con trỏ trỏ ở đầu là head
//một con trỏ trỏ ở cuối là rear
//một con nữa là pos để trỏ tới vị trí mình xét
NODE[T] *head;
NODE[T] *pos;
NODE[T] *rear;
int count; // biến đếm xác đinh số nút
public:
List();// khỏi tạo
~List();// hũy
//hàm Insert để chèn 1 nút vô danh sách liên kết
//insert gồm 2 tham số là datain và NODE[T]*p
//datain là thông tin của nút đưa vào
//NODE[T] *p là vị trí mình mún chèn vào
void Insert(T datain,NODE[T] *p);
void NhapDS();
void XuatDS();
};
template[class T]
List[T]::List()
{
pos=head=rear=NULL;
count=0;
}
template[class T]
List[T]::~List()
{
}
//các thao tác để chèn dữ liệu
// tạo ra một nút mới có tên là pnew
//gán dữ liệu mún chèn vào cho phần dữ liêu của nút pnew
//nếu p (vị trí mún chèn vào) là NULL thì chèn đầu
//ngược lại chèn sau p
//nếu phần kế tiếp của p =NULL chèn cuối
//tăng biến đếm count lên 1
template[class T]
void List[T]::Insert(T datain,NODE[T] *p)
{
//cấp phát động cho pnew
//cấu trúc cấp phát độg : [kiểu dữ liêu] *[tên con trỏ] = new [kiểu dữ liệu] ;
NODE[T] *pnew=new NODE[T];
//gán dữ liệu cho pnew->data
memcpy(&pnew->data,&datain,sizeof(T));
if(p==NULL) // chèn đầu
{
pnew->next=head;
head=pnew;
}
else // chèn sau p
{
pnew->next=p->next;
p->next=pnew;
}
if(pnew->next==NULL) // chèn cuối
rear=pnew;
count++;
}
//Tiếp đến là hàm nhập danh sách ko cần template
//Tạo một hàm nhập 1 sinh viên bao gồm 3 thông tin
// 3 thông tin chứa trong struct SINHVIEN
void Nhap1sinhvien(SINHVIEN &p) // tham chiếu vì để lấy dứ liệu
{
cout<<"Ho va Ten :";
cin.ignore(1,30); // xóa bỏ bộ đệm tương đương với flushalll()
cin.getline(p.Hoten,30,'\n'); // nhập 1 chuổi trong C++
cout<<"MASSV: ";
cin>>p.MASSV;
cout<<"Toan = ";
cin>>p.diem.Toan;// truy cập thông tin cấu truc struct lông nhau
cout<<"Ly = ";
cin>>p.diem.Ly;
cout<<"Hoa = ";
cin>>p.diem.Hoa;
}
//hàm nhập 1 danh sách
template[class T]
void List[T]::NhapDS()
{
T datain;
int n;
cout<<"Nhap so sinh vien n = ";
cin>>n;
for(int i=0;i
{
cout<<"Nhap thong tin Sinh vien thu "<
Nhap1sinhvien(datain);
Insert(datain,rear);// chèn vào cuối
}
}
template [class T]
void List[T]::XuatDS()
{
T dataout;
pos=head;// cho pos bắt đầu danh sách
while(pos!=NULL)
{
// chép dữ liệu tại nút mà pos đang trỏ tới vào dataout
memcpy(&dataout,&pos->data,sizeof(T));
//Xuất dataout
Xuat1phantu(dataout);// goi hàm
pos=pos->next; // dịch pos sang 1 vị trí
}
}
void Xuat1phantu(SINHVIEN p)// ko dùng tham chiều chỉ để in ra
{
cout<
cout<<"\t"<
}
void main()
{
// khai bao khi dung class
// cấu trúc : ten Class [Kiểu dữ liêu] ten;
List[SINHVIEN] sv; //kiểu lúc này là kiểu SINHVIEN
sv.NhapDS();
cout<<"Ho va ten\t\tMASSV\tToan\tLy\tHoa\n";
sv.XuatDS();
getch();
}