Code bị lỗi "Exception thrown: read access violation."

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

mọi người giup e vs ạ

Hàm này cso được gọi đâu?
CreateDG

3 Likes

à cái hàm đó e đã thay thành hàm NhapDG rồi ạ, e quên xóa cái đó

Vậy bạn đã viết lại hết nội dung của hàm CreateDG trong hàm NhapDG chưa?
Tại mình thấy thiếu phần gán list… gì kìa

3 Likes

à e có thiếu 2 dòng gán vào, thêm vào thì nó thành ra thế nạy ạ :sweat:
https://sv1.uphinhnhanh.com/images/2018/04/15/Untitledfe419.png

Đặt breakpoint và debug thôi :slight_smile:
In ra xem dg->listmuontra nó có giá trị gì?
Và nhớ lại lời rogp10 dặn ở topic trc nhé.

3 Likes

Dạ vâng e cám ơn ạ :heart_eyes:, chắc e sẽ hỏi tiếp nếu sau có lỗi quá :joy:


anh cho em hỏi cách fix lỗi này với ạ

Đọc thông báo đi bạn.
h was nullptr <= mấu chốt vấn đề đây.
Bạn đang truy xuất giá trị (h.data) của một co trỏ có giá trị nullptr (không có giá trị nào cả).

1 Like


cho em hỏi lỗi này là lỗi gì ạ? em sửa tới lui while hay for đều bị và đây là code của em

#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>

struct Node
{
	int info;
	Node* next;
};

struct List
{
	Node* head;
	Node* tail;
};

void createList(List& l)
{
	l.head = NULL;
	l.tail = NULL;
}

int isEmty(List l)
{
	if (l.head == NULL)
		return 1;
	return 0;
}

Node* createNode(int x)
{
	Node* p = new Node;
	if (p == NULL)
		printf("\nKhong du bo nho cap phat!");
	p->info = x;
	p->next = NULL;
	return p;
}


void addTail(List& l, Node* p)
{
	if (p == NULL)
		return;
	if (l.head == NULL)
		l.head = l.tail = p;
	else
	{
		l.tail->next = p;
		l.tail = p;
		p->next = NULL;
	}
}

void GetData(List& l)
{
	int n, x;
	createList(l);
	FILE* f;
	f = fopen("Data.txt", "r");
	fscanf(f, "%d\n", &n);
	for (int i = 0; i < n; i++)
	{
		fscanf(f, "%d#", &x);
		Node* p = createNode(x);
		addTail(l, p);
	}
}

void printNode(Node* p)
{
	printf("  %d", p->info);
}

void printList(List l)
{
	printf("\n Noi Dung DSLK Don \n");
	for (Node* p = l.head; p != NULL; p = p->next)
	{
		printNode(p);
	}
}

Node* findNode(List l, int x)
{
	for (Node* p = l.head; p != NULL; p = p->next)
	{
		if (p->info == x)
			return p;
	}
	return NULL;
}

void IncrSort(List& l)
{
	for (Node* p = l.head; p != NULL; p = p->next)
	{
		for (Node* q = p->next; q != NULL; q = q->next)
		{
			if (p->info > q->info)
			{
				int tmp = p->info;
				p->info = q->info;
				q->info = tmp;
			}
		}
	}
}

void DecrSort(List& l)
{
	for (Node* p = l.head; p != NULL; p = p->next)
	{
		for (Node* q = p->next; q != NULL; q = q->next)
		{
			if (p->info < q->info)
			{
				int tmp = p->info;
				p->info = q->info;
				q->info = tmp;
			}
		}
	}


}

void addHead(List& l, Node* p)
{
	if (p == NULL)
		return;
	else
	{
		p->next = l.head;
		l.head=p;
	}
}

void addAfter(List& l, Node* p, Node* q)
{
	if (q == NULL)
		return;
	if (q == l.tail)
		addTail(l, p);
	else
	{
		p->next = q->next;
		q->next = p;
	}
}

void delHead(List& l, Node* p)
{
	if (p == NULL)
		return;
	else
	{
		l.head = l.head->next;
		p->next = NULL;
		delete p;
	}
}

void delTail(List& l, Node* p)
{
	if (p == NULL)
		return;
	else
	{
		Node* q = l.head;
		while (q->next != p)
		{
			q = q->next;
		}
		q->next = NULL;
		l.head = q;
		delete p;
	}
}

void delAny(List& l, Node* p)
{
	Node* q = l.head;
	if (p == l.head)
		delHead(l, p);
	if (p == l.tail)
		delTail(l, p);
	else
	{
		while (q->next != p)
		{
			q = q->next;
		}
		q->next = p->next;
		p->next = NULL;
		delete p;
	}

}

void del_Chan(List& l)
{
	for (Node* p = l.head; p != NULL; p = p->next)
	{
		if ((p->info % 2) == 0)
			delAny(l, p);
	}
}

void menu()
{
	printf("\n\t\tBAI TAP TREN LOP 1");
	printf("\n1  | a.Them phan thu vao cuoi danh sach sl.");
	printf("\n2  | b.Chen them phan tu co gia tri x vao truoc phan tu co gia tri y.");
	printf("\n3  | c.Viet ham xoa cac phan tu lon hon x trong dslk.");
	printf("\n4  | d.Viet ham xoa cac phan tu chan trong dslk.");
	printf("\n5  | e.Sap xep dslk tang dan, giam dan.");
	printf("\n6  | f.Cho biet dslk co bao nhieu so nguyen to.");
	printf("\n7  | g.Tinh tong cac so chinh phuong trong dslk.");
	printf("\n8  | h.Tim phan tu nho nhat, lon nhat trong dslk.");
	printf("\n9  | i.Cho biet trong dslk co bao nhieu phan tu lon hon gap doi phan tu phia sau no.");
	printf("\n10 | j.Tu sl tao 2 danh sach moi, sl1 chua cac so chan, sl2 chua cac so le");
	printf("\n11 | Thoat chuong trinh.");
}

void main()
{
	int a, n, x, y;
	Node* p, * q, * r;
	List sl, sl1, sl2;
	menu();
	GetData(sl);
	printList(sl);
	do
	{
		do
		{
			printf("\nNhap so de chon yeu cau:"); scanf_s("%d", &a);
			if (a < 1 || a > 11)	printf("\nLoi! Hay nhap lai.");
			switch (a)
			{
			case 1:
			{
				srand(time(NULL));
				x = rand() % (50 - -50 +1) + -50;
				p = createNode(x);
				addTail(sl, p);
				printList(sl);
				break;
			}
			case 2:
			{

				printf("\nNhap vao gia tri x: "); scanf("%d", &x);
				p = createNode(x);
				printf("\nNhap va gia tri y: "); scanf("%d", &y);
				q = findNode(sl, y);
				if (q == NULL)
					printf("\nKhong tim thay gia tri y de them x!");
				if (q == sl.head)
					addHead(sl, p);
				else
				{
					r = sl.head;
					while (r->next != q)
					{
						r = r->next;
					}
					addAfter(sl, p, r);
				}
				printList(sl);
				break;
			}
			case 3:
			{
				printf("\nNhap vao gia tri x: "); scanf("%d", &x);
				int check = 0;
				p = sl.head;
				while (p!=NULL)
				{
					if (p->info > x)
						delAny(sl, p);
					p = p->next;
					check = 1;
				}
				if (check == 0)
					printf("\nKhong tim thay phan tu co gia tri lon hon x!");
				printList(sl);
				break;
			}
			case 4:
			{
				printList(sl);
				break;
			}
			default:
				break;
			}
		} while (a < 0 || a>10);
	} while (a != 11);
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?