Bị trôi lệnh và xuất ra sai giá trị

E đang làm bài tập lớn CTDL & GT.
có 1 ý là nhập danh sách các đọc giả, đây là e chỉ demo trước nhập 1 đọc giả
code của e

Cho e hỏi thêm với ạ.
tại sao lúc e nhập thì nó chỉ cho nhập đến phai chứ ko đến câu lệnh nhập trang thai
và khi nhập xong e xuất ra thì nó lại lấy giá trị nhập vào của ho gán cho ten và giá trị của ten gán cho phai

e kiểm tra nhiều lắm rồi nên e mới đăng lên để hỏi ạ, mong mọi người giúp e, e cám ơn

#include<iostream>
#include<string.h>
using namespace std;

#define MaxList 200


//Danh mục sách
struct DANHMUCSACH 
{
	int MaSach;
	int TrangThai;
	int ViTri;
};
typedef struct DANHMUCSACH DMS;
struct NODEDANHMUCSACH
{
	DMS dms;
	NODEDANHMUCSACH *pNext;
};
typedef NODEDANHMUCSACH NodeDMS;
struct LISTDANHMUCSACH
{
	NodeDMS *pHead;
	NodeDMS *pTail;
};
typedef struct LISTDANHMUCSACH LISTDMS;
//Khởi tạo List Danh mục sách
void InitLISTDMS(LISTDMS &list)
{
	list.pHead = NULL;
	list.pTail = NULL;
}
//Đầu sách
struct DAUSACH 
{
	int ISBN;
	char TenSach[100];
	int SoTrang;
	char TacGia[50];
	int NamXB;
	char TheLoai[50];
	LISTDMS *ListDMS;
};

// Danh sách mượn trả
struct MUONTRA
{
	int MaSach;
	char NgayMuon[15];
	char NgayTra[15];
	int TrangThai;

};
struct NODEMUONTRA
{
	MUONTRA muontra;
	NODEMUONTRA *pNext;
};
typedef struct NODEMUONTRA NodeMuonTra;
struct LISTMUONTRA
{
	NodeMuonTra *pHead;
	NodeMuonTra *pTail;
};
typedef struct LISTMUONTRA ListMuonTra;
// khởi tạo danh sách mượn trả ban đầu
void InitListMuonTra(ListMuonTra &list)
{
	list.pHead = NULL;
	list.pTail = NULL;
}

//Danh sách độc giả
struct DOCGIA
{
	int MaDG;
	char Ho[10];
	char Ten[15];
	char Phai[5];
	int trangthai;
	ListMuonTra *listmuontra;
};
typedef struct DOCGIA DocGia;
struct NODEDOCGIA
{
	DocGia dg;
	struct NODEDOCGIA *pLeft;
	struct NODEDOCGIA *pRight;
};
typedef struct NODEDOCGIA NodeDocGia;
typedef NodeDocGia* TREEDocGia;
// Khởi tại tree độc giả
void InitTreeDocGia(TREEDocGia &t)
{
	t = NULL;
}
DocGia *CreateDG(int mdg, char *ho, char *ten, char *phai, int tt, ListMuonTra *l)
{
	DocGia *dg;
	dg = new DocGia;
	if (dg == NULL) exit(1);
	else
	{
		dg->MaDG = mdg;
		strcpy_s(dg->Ho, ho);
		strcpy_s(dg->Ten, ten);
		strcat_s(dg->Phai, phai);
		dg->trangthai = tt;
		dg->listmuontra = l;
	}
	return dg;
}
// Thêm độc giả vào cây
void AddNDG(TREEDocGia &t,DocGia q)
{
	if (t == NULL)
	{
		NodeDocGia *d = new NodeDocGia;
		d->dg = q;
		d->pLeft = NULL;
		d->pRight = NULL;
		t = d;
	}
	else {
		if (t->dg.MaDG > q.MaDG)
		{
			AddNDG(t->pLeft, q);
		}
		else { if (t->dg.MaDG < q.MaDG)
			AddNDG(t->pRight, q);
		}
	}
}
void Xuatlist(ListMuonTra l)
{

	NodeMuonTra *p = new NodeMuonTra;
	p = l.pHead;
	while (p != NULL)
	{
		cout << "\nMa sach: " << p->muontra.MaSach;
		cout << "\nNgay muon: " << p->muontra.NgayMuon;
		cout << "\nNgay tra: " << p->muontra.NgayTra;
		cout << "\nTrang thai: " << p->muontra.TrangThai;
		p = p->pNext;
	}

}
//xuất các độc giả
void XuatDG(TREEDocGia t)
{
	if (t != NULL)
	{
		cout << "\nMa doc gia: " << t->dg.MaDG;
		cout << "\nHo doc gia: " << t->dg.Ho;
		cout << "\nTen doc gia: " << t->dg.Ten;
		cout << "\nPhai: " << t->dg.Phai;
		cout << "\nTrang thai the: " << t->dg.trangthai;
		NodeMuonTra *p = new NodeMuonTra;
		p = t->dg.listmuontra->pHead;
		while (p != NULL)
		{
			cout << "\nMa sach: " << p->muontra.MaSach;
			cout << "\nNgay muon: " << p->muontra.NgayMuon;
			cout << "\nNgay tra: " << p->muontra.NgayTra;
			cout << "\nTrang thai: " << p->muontra.TrangThai;
			p = p->pNext;
		}
		XuatDG(t->pLeft);
		XuatDG(t->pRight);
	}
}
// hàm main
int main()
{
	TREEDocGia t;
	DocGia *dg=new DocGia;
	int mdg, tt;
	char ho[30], ten[30], phai[5];
	ListMuonTra l;
	InitListMuonTra(l);
	InitTreeDocGia(t);
	cout << "Nhap ma DG:"; cin >> mdg;
	cout << "Nhap Ho doc gia: "; cin.getline(ho, 30);
	cin.ignore();
	cout << "Nhap ten doc gia:"; cin.getline(ten, 30);
	cin.ignore();
	cout << "Nhap Phai: "; cin.getline(phai, 5);
	cin.ignore();
	cout << "Trang thai the: "; cin >> tt;
	dg = CreateDG(mdg, ho, ten, phai, tt, &l);
	AddNDG(t, *dg);
	XuatDG(t);
	system("pause");
	return 0;
}

lỗi dưới này e fix r ạ
lúc e nhập xong các thông tin thì nó chỉ lỗi sai ở dòng dg->MaDG = mdg; trong phần DocGia *CreateDG
Project1.exe has triggered a breakpoint. occurred
Trong bài có lỗi gì thì mong góp ý cho e với ạ, e cám ơn nhiều !!!

Sai ở trong hàm AddNDG, cụ thể là ngay cái if đầu tiên :3

3 Likes

có thể chỉ rõ cho e được k , e cám ơn ạ

Để ý nè

3 Likes

e mới học cái này nên e cũng chưa hiểu rõ lắm á, ở 2 cái left right có phải là d k ạ

:3 Đúng rồi,
t là NULL, mà NULL là không có gì thì sao mà xài nó được.

2 Likes

Và nói chung là vì phải khởi tạo node cho xong rồi mới đem gán, nếu không khi văng lỗi thì cây sẽ ở trong trạng thái “dở người”.

1 Like

dạ e cám ơn nhiều ạ :heart_eyes:

Cho e hỏi thêm với ạ.
tại sao lúc e nhập thì nó chỉ cho nhập đến phai chứ ko đến câu lệnh nhập trang thai
và khi nhập xong ei xuất ra thì nó lại lấy giá trị nhập vào của ho gán cho ten và giá trị của ten gán cho phai

e kiểm tra nhiều lắm rồi nên e mới đăng lên để hỏi ạ, mong mọi người giúp e, e cám ơn

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