Mọi người có thể fix giúp e thêm chức năng:
+Tìm kiếm thí sinh theo số báo danh của thí sinh và in ra thông tin của thí sinh đó ra màn hình .
+Tìm kiếm thí sinh theo số báo danh của thí sinh và xóa thí sinh đó ra khỏi cây.
Được k ạ. E cảm ơn ạ!
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
using namespace std;
struct Date {
int Ngay, Thang, Nam;
};
struct ThiSinh {
char SBD[50];
char HoTen[50];
char QQ[50];
Date NgaySinh;
double Toan;
double Ly;
double Hoa;
};
struct NODE
{
ThiSinh Key;
NODE* Left, * Right;
};
typedef NODE *Tree;
int compare(ThiSinh x, ThiSinh y)
{
return strcmp(x.SBD, y.SBD);
}
ThiSinh Nhapts()
{
ThiSinh x;
cout << "Nhap so bao danh (Q de quay lai): ";
gets(x.SBD);
if (strcmp(x.SBD, "q") == 0 || strcmp(x.SBD, "Q") == 0)
{
return x;
}
cout << "Nhap ten thi sinh: ";
gets(x.HoTen);
cout << "Nhap que quan: ";
gets(x.QQ);
cout << "Nhap ngay/ thang/ nam sinh: \n";
cout << "Nhap ngay: ";
cin >> x.NgaySinh.Ngay;
cout << "Nhap thang: ";
cin >> x.NgaySinh.Thang;
cout << "Nhap nam: ";
cin >> x.NgaySinh.Nam;
cout << "Nhap diem toan: ";
while (true)
{
cin >> x.Toan;
if (cin.fail() || x.Toan > 10 || x.Toan < 0)
{
cin.clear();
_flushall();
cin.ignore();
cout << "Nhap lai diem toan: ";
}
else
{
break;
}
}
cout << "Nhap diem ly: ";
while (true)
{
cin >> x.Ly;
if (cin.fail() || x.Ly > 10 || x.Ly < 0)
{
cin.clear();
_flushall();
cin.ignore();
cout << "Nhap lai diem ly: ";
}
else
{
break;
}
}
cout << "Nhap diem hoa: ";
while (true)
{
cin >> x.Hoa;
if (cin.fail() || x.Hoa > 10 || x.Hoa < 0)
{
cin.clear();
_flushall();
cin.ignore();
cout << "Nhap lai diem hoa: ";
}
else
{
break;
}
}
while (getchar() != '\n');
return x;//
}
void Xuat(ThiSinh x)
{
cout << "=========================================" << endl;
cout << "So Bao Danh: " << x.SBD << "\n";
cout << "Ten Thi Sinh: " << x.HoTen << "\n";
cout << "Ngay sinh: " << x.NgaySinh.Ngay << "/" << x.NgaySinh.Thang << "/" << x.NgaySinh.Nam << "\n";
cout << "Que Quan: " << x.QQ << "\n";
cout << "Diem Toan: " << x.Toan << "\n";
cout << "Diem Ly: " << x.Ly << "\n";
cout << "Diem Hoa: " << x.Hoa << "\n";
}
int InsertNode(Tree &T, ThiSinh x)
{
if (T != NULL)
{
if (compare(T->Key, x) == 0)
{
return -1;//Node này dã có
}
if (compare(T->Key, x) > 0)
{
return InsertNode(T->Left, x);//chèn vào node trái
}
if (compare(T->Key, x) < 0)
{
return InsertNode(T->Right, x);//Chèn vào node ph?i
}
}
T = (NODE*)malloc(sizeof(NODE));
if (T == NULL)
{
cout << "Khong du bo nho de cap phat!";
return 0;
}
T->Key = x;
T->Left = T->Right = NULL;
return 1;
}
void CreateTree(Tree &T) //Nh?p cây
{
ThiSinh x;
while (1)
{
cout << "--Nhap Thong Tin Cua Sinh Vien Can Them--" << endl << endl;
x = Nhapts();
if (strcmp(x.SBD, "q") == 0 || strcmp(x.SBD, "Q") == 0)
{
break; //B?ng 0 thì thoát
}
int check = InsertNode(T, x);
if (check == -1)
{
cout << "---So Bao Danh Da Co---\n" << endl;
}
else if (check == 0)
{
cout << "---Bo Nho Day---\n" << endl;
}
else
cout << "---Them Thanh Cong---\n\n";
}
}
void LNR(Tree T)
{
if (T != NULL)
{
LNR(T->Left);
Xuat(T->Key);
LNR(T->Right);
}
}
NODE* Search(Tree &T, ThiSinh x)
{
if (T == NULL)
return NULL;
if (x.SBD < T->Key.SBD)
Search(T->Left, x);
else
if (x.SBD > T->Key.SBD)
Search(T->Right, x);
else if (x.SBD == T->Key.SBD)
{
return T;
}
}
/*
NODE* Search(Tree &T, char SBD[])
{
cout<<"Nhap vao so bao danh can tim: ";
gets(SBD);
if(T!=NULL){
if(SBD==T->Key.SBD){
cout <<"So bao danh: " << T->Key.SBD << "\n";
cout<<"Ten: "<<T->Key.HoTen << "\n";
cout<<"Que Quan: "<<T->Key.QQ << "\n";
cout << "Ngay sinh: " << T->Key.NgaySinh.Ngay << "/" << T->Key.NgaySinh.Thang << "/" << T->Key.NgaySinh.Nam << "\n";
cout << "Toan: " << T->Key.Toan << "\n";
cout << "Ly: " << T->Key.Ly << "\n";
cout << "Hoa: " << T->Key.Hoa << endl;
}
Search(T->Left,SBD);
Search(T->Right,SBD);
}
}*/
//Tim mot phan tu the mang cho nut goc dung de quy
void SearchStandFor(Tree &T, NODE* &q)
{
if (T->Right)
SearchStandFor(T->Right,q);
else
{
q->Key = T->Key;
q = T;
T = T->Left;
}
}
//Xoa node
void RemoveNode(Tree &T, ThiSinh x)
{
NODE* p;
if(T == NULL)
cout << x.SBD << " khong co trong cay!";
else
{
if (x.SBD < T->Key.SBD)
RemoveNode(T->Left,x);
else
if (x.SBD > T->Key.SBD)
RemoveNode(T->Right,x);
else
{
p = T;
if(p->Right == NULL)
T = p->Left; // Node chi co cay con trai
else
if (p->Left == NULL)
T = p->Right; // Node chi co cay con phai
else {
SearchStandFor(T->Left,p);// Node co ca 2 con
}
delete p;
}
}
}
int main()
{
Tree T = NULL;
NODE *p;
ThiSinh x;
CreateTree(T);
cout << "Danh sach thong tin thi sinh sau khi nhap la: \n";
LNR(T);
//Them thi sinh
CreateTree(T);
cout << "Danh sach thong tin thi sinh sau khi them la: \n";
LNR(T);
cout<<"Nhap vao so bao danh can tim: ";
gets(x.SBD);
p = Search(T, x);
if(p != NULL)
{
Xuat(x);
/*
cout << "So bao danh nay co trong danh sach!";
cout << "Thong tin cua thi sinh vua tim kiem la: \n";
cout <<"So bao danh: " << T->Key.SBD << "\n";
cout <<"Ten: "<<T->Key.HoTen << "\n";
cout <<"Que Quan: "<<T->Key.QQ << "\n";
cout << "Ngay sinh: " << T->Key.NgaySinh.Ngay << "/" << T->Key.NgaySinh.Thang << "/" << T->Key.NgaySinh.Nam << "\n";
cout << "Toan: " << T->Key.Toan << "\n";
cout << "Ly: " << T->Key.Ly << "\n";
cout << "Hoa: " << T->Key.Hoa << endl;
*/
}
else
{
cout << "So bao danh khong co trong danh sach!";
}
/*
cout << "Nhap vao 1 gia tri de tim: ";
cin >> x.SBD;
p = Search(T, x);
if(p != NULL)
{
cout << x.SBD << " co trong cay!";
RemoveNode(T, x);
LNR(T);
}
else
cout << x.SBD << " khong co trong cay!";
//Xoa thi sinh
char del = 1;
while (del) {
NODE* node = Search(T, x);
if (node != NULL) {
cout << "del";
del == RemoveNode(T, node->Key.SBD);
} else {
cout << "Null";
del = 0;
}
}
printf("Danh sach thi sinh sau khi xoa: \n");
LNR(T);*/
}