Mọi người giúp e sửa lỗi này với ạ, làm sao để xuất list trong 1 cây nhị phân!!!
E có cây nhị phân trong đó có chứa 1 danh sách liên kết đơn, lúc e nhập xong rồi thì e xuất thông tin trên cây nhị phân ko được và nó bào lỗi “Exception thrown: read access violation._
_t->dg.listmuontra was 0xCDCDCDCD. occurred”_ ở dòng p = t->dg.listmuontra->pHead;
trong khi đó e xuất riêng list đó thì vẫn được.
code của e, mong mọi người giúp e với, e đang làm bài tập lớn, e đã tìm hiểu rồi mới đăng lên hỏi ạ.
e cám ơn ạ!!!
#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;
};
typedef struct MUONTRA MuonTra;
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;
}
NodeMuonTra *CreateMT(int ms, char *nm, char *nt, int tt)
{
NodeMuonTra *p = new NodeMuonTra;
if (p == NULL)
exit(1);
else
{
p->muontra.MaSach = ms;
strcpy_s(p->muontra.NgayMuon, nm);
strcpy_s(p->muontra.NgayTra, nt);
p->muontra.TrangThai = tt;
p->pNext = NULL;
}
return p;
}
void AddMuontra(ListMuonTra &l, NodeMuonTra *p)
{
if (l.pHead == NULL)
{
l.pHead = l.pTail = p;
}
else
{
l.pTail->pNext = p;
l.pTail = p;
}
}
//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;
}
void *CreateDG(DocGia *&dg,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->pHead = l->pHead;
dg->listmuontra->pTail = l->pTail;
}
}
// Thêm đọc giả vào cây
void AddNDG(TREEDocGia &t,DocGia q)
{
if (t == NULL)
{
NodeDocGia *d = new NodeDocGia;
/*d->dg.MaDG = q.MaDG;
strcpy_s(d->dg.Ho, q.Ho);
strcpy_s(d->dg.Ten, q.Ten);
strcpy_s(d->dg.Phai, q.Phai);
d->dg.trangthai = q.trangthai;*/
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;
cout << "\nDanh sach muon tra: \n";
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);
}
}
void NhapDG(DocGia *&dg)
{
int mdg, tt,x;
int ms, tt2;
char ngaytra[15], ngaymuon[15];
char ho[30], ten[30], phai[5];
dg = new DocGia;
ListMuonTra l;
InitListMuonTra(l);
cout << "Nhap ma DG:"; cin >> mdg;
dg->MaDG = mdg;
cin.ignore();
cout << "Nhap Ho doc gia: "; cin.getline(ho, 30);
strcpy_s(dg->Ho, ho);
cout << "Nhap ten doc gia:"; cin.getline(ten, 30);
strcpy_s(dg->Ten, ten);
cout << "Nhap Phai: "; cin.getline(phai, 5);
strcpy_s(dg->Phai, phai);
cout << "Trang thai the: "; cin >> tt;
dg->trangthai = tt;
cout << "Nhap danh sach muon tra, ket thuc bang so 0:";
do {
cout << "Nhap ma sach: "; cin >> ms;
cin.ignore();
cout << "Nhap ngay muon: "; cin.getline(ngaymuon, 15);
cout << "Nhap ngay tra:"; cin.getline(ngaytra, 15);
cout << "Nhap trang thai: "; cin >> tt2;
NodeMuonTra *p = CreateMT(ms, ngaymuon, ngaytra, tt2);
AddMuontra(l, p);
cout << "\ntiep tuc nhap bam <>0\n"; cin >> x;
} while (x != 0);
}
// hàm main
int main()
{
TREEDocGia t;
DocGia *dg=new DocGia;
InitTreeDocGia(t);
NhapDG(dg);
AddNDG(t, *dg);
XuatDG(t);
system("pause");
return 0;
}