Hỏi đáp

Chia sẻ kiến thức, cùng nhau phát triển

Làm sao để xuất danh sách liên kết trong 1 cây nhị phân ra

16:05 15-04-2018 447 lượt xem 0 bình luận

E chào mọi người, e đang làm bài tập CTDL, e có 1 cây nhị phân như sau

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;

lúc e nhập xong hết rồi thì e lại xuất thông tin trên cây nhị phân ra thì nó xuất ngang đến List thì nó báo lỗi. còn e thử nhập xong rồi xuất chỉ mỗi cái list thì nó được.

lỗi là  "Exception thrown: read access violation.  t->dg.listmuontra** was 0xCDCDCDCD. occurred** "

ở dòng 

		p = t->dg.listmuontra->pHead;

code đây đủ của e, đây là e chỉ demo nhập 1 người thôi ạ, mong mọi người giúp e ạ, e cám ơn nhiều !!!

#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;
}
// 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;
}

 

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập

Câu hỏi mới nhất