Cây nhị phân tìm kiếm tìm kiếm điểm của thí sinh thi đại học

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);*/
}

Hm, cậu gặp vấn đề gì khi implement các chức năng đó vậy? Tớ thấy cậu đã code đc khá nhiều rồi mà?

3 Likes

Code mình gặp vấn đề ở phần main khi triển khai chức năng ấy

Hm. Đây không phải code của cậu, phải không? :smiley:

3 Likes

Thực ra đây là 1 báo cáo chuyên đề môn mình phải làm và tài liệu trên lớp k đủ nên mình đã tham khảo rất nhiều code trên mạng.

Tớ e là tớ không giúp gì được cậu trong TH này rồi :smiley:

Cậu không code bất cứ dòng nào ở đây. Tớ có thấy cậu phải comment từng dòng bằng tiếng Việt để hiểu từng chi tiết một cách thái quá, điều đó có nghĩa là cậu không đủ kiến thức để viết ra những dòng code đó (cho dù code đó cũng không tốt gì). Cậu cũng không thực sự hiểu vấn đề của cậu, thế nên cậu mới trả lời “vấn đề triển khai chức năng ở hàm main” - cố gắng nói 1 cách chung chung để đánh lạc hướng.
Cậu đưa ra câu hỏi, thực chất là nhờ mọi người làm hộ bài tập của cậu, trong khi cậu không bỏ công sức ra. Tớ nghĩ cậu nên tự giải quyết vấn đề thực sự của cậu sẽ tốt hơn.

Hi vọng có bạn nào đó khác giúp cậu :smiley:

5 Likes

Code C++ mà lẫn lộn cả C thế này, với lại trong code cũng có bug, vậy bạn nên tự code lại từ đầu thì hơn.

3 Likes

ThiSinh.SBD kiểu char[50] phải không?
Một chuỗi kiểu char[] thì không thể dùng các phép so sánh luận lý được (== != > <...). Ơ kìa, bạn có dùng strcmp() đấy!
Rõ khổ, “râu ông nọ, cắm cằm bà kia”!

Theo như bạn viết, một cách tổng quát thì mã của bạn là C++. Đã vậy thì dùng chuỗi trong C++, ai lại nửa C, nửa C++. Lúc thì scanf(), printf() lúc thì cin, cout.
Thư viện <string> của C++: http://www.cplusplus.com/reference/string/string/

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?