Lỗi xử lí với danh sách liên kết đơn?

Chào mọi người, mình đang làm bài dslk đơn quản lí danh sách hình chữ nhật, trên onlinegdb.com thì chạy tốt nhưng VS 2017 và 2013 đều lỗi khi đang xử lí trên console, debug thì ra thì báo lỗi Access violation reading location 0x00008137 tại hàm Delete. Mọi người xem giúp mình với, cảm ơn.

#include <iostream>
using namespace std;

struct Diem
{
	int x, y;
};
typedef Diem DIEM;

struct HinhChuNhat
{
	Diem Tren;
	Diem Duoi;
	int DienTich = 0;
};
typedef HinhChuNhat HCN;

void NhapDiem(Diem &x)
{
	cout << "\nNhap toa do x: ";
	cin >> x.x;
	cout << "Nhap toa do y: ";
	cin >> x.y;
}

void DienTich(HCN &a)
{
	int AB = a.Tren.y - a.Duoi.y;
	if (AB < 0)
		AB *= -1;
	int BC = a.Tren.x - a.Duoi.x;
	if (BC < 0)
		BC *= -1;
	int S = AB * BC;
	a.DienTich = S;
}

void NhapHCN(HCN &x)
{
	cout << "\nNhap hinh chu nhat: " << endl << endl;
	cout << "Nhap diem tren: ";
	NhapDiem(x.Tren);
	cout << "\nNhap diem duoi: ";
	NhapDiem(x.Duoi);
	DienTich(x);
}
void XuatDiem(Diem a)
{
	cout << "Diem (" << a.x << "," << a.y << ")" << endl;
}

void XuatHCN(HCN a)
{
	cout << "\nHinh chu nhat: " << endl;
	XuatDiem(a.Tren);
	XuatDiem(a.Duoi);
	cout << "Dien tich: " << a.DienTich << endl;
}

struct node
{
	HCN a;
	struct node *pNext;
};
typedef node NODE;

struct list
{
	NODE *pHead;
	NODE *pTail;
};
typedef list LIST;

void creatLIST(LIST &l)
{
	l.pHead = l.pTail = NULL;
}

NODE *creatNode(HCN e)
{
	NODE *p = new NODE;
	if (p == NULL)
	{
		return NULL;
	}
	p->a = e;
	p->pNext = NULL;
	return p;
}

void addTail(LIST &l, node *p)
{
	if (l.pHead == NULL)
	{
		l.pHead = l.pTail = p;
	}
	else
	{
		l.pTail->pNext = p;
		l.pTail = p;
	}
}

void input(LIST &l, int n)
{
	creatLIST(l);
	for (int i = 1; i <= n; i++)
	{
		HCN x;
		NhapHCN(x);
		NODE *p = creatNode(x);
		addTail(l, p);
	}
}
void output(LIST l)
{
	for (NODE *p = l.pHead; p != NULL; p = p->pNext)
	{
		XuatHCN(p->a);
		cout << endl;
	}
	cout << endl;
}

void TimMax(LIST l)
{
	int max = l.pHead->a.DienTich;
	for (NODE *p = l.pHead->pNext; p != NULL; p = p->pNext)
	{
		if (p->a.DienTich > max)
			max = p->a.DienTich;
	}
	for (NODE *p = l.pHead; p != NULL; p = p->pNext)
	{
		if (p->a.DienTich == max)
		{
			cout << "HCN co dien tich lon nhat: " << endl;
			XuatHCN(p->a);
		}
	}
	cout << endl;
}

void Swap(NODE *&p, NODE *&k)
{
	NODE *temp = new NODE;
	temp->a = p->a;
	p->a = k->a;
	k->a = temp->a;
}

void Sort(LIST &l)
{
	cout << "Sap xep danh sach theo do lon Dien tich: " << endl;
	for (NODE *p = l.pHead; p != l.pTail; p = p->pNext)
	{
		for (NODE *j = l.pHead->pNext; j != NULL; j = j->pNext)
		{
			if (p->a.DienTich > j->a.DienTich)
			{
				Swap(p, j);
			}
		}
	}
}
void Delete(LIST &l, int x) {
	int dem = 0;
	for (NODE *j = l.pHead; j != NULL; j = j->pNext) //**Bao loi o day**
	{
		if (j->a.DienTich == x)
		{
			for (NODE *p = l.pHead; p != NULL; p = p->pNext)
			{
				if (p->pNext == j)
				{
					p->pNext = j->pNext;
					cout << "co dien tich" << endl;
					delete j;
					dem++;
				}
			}
		}
	}
	if (dem == 0)
		cout << "Khong tim thay HCN can xoa!" << endl << endl;
	else
		cout << "Da xoa HCN." << endl << endl;
}

int main()
{
	int n, r;
	cout << "Nhap n: ";
	cin >> n;
	LIST l;
	input(l, n);
	output(l);
	TimMax(l);
	Sort(l);
	output(l);
	cout << "Nhap dien tich HCN can xoa: ";
	cin >> r;
	Delete(l, r);
	output(l);
	system("pause");
	return 0;
}

ở trong delete j; rồi thì làm sao mà vòng lặp for nó chạy j = j->pNext được nữa

khi ở j thì kiểm tra j->next có cần xóa hay ko, chứ đừng kiểm tra j. Kiểm tra thêm head nữa là đc

2 Likes

cảm ơn, mình sẽ sửa lại

ko nhất thiết phải thêm 1 vòng lặp nữa đâu thấy node xóa thì sẽ có 3 TH
1.node đầu
2.node giữa
3.node cuối
bạn sẽ kiểm tra xem nó có rơi vào 3 TH trên hay ko 1 và 3 thì dễ rồi
riêng node giữa bạn tạo thêm 1 biến node giữ = j trong TH bạn ko tìm thấy node xóa nếu ko tìm thấy thì gán node vừa tìm đó cho node giữ

node giữ = null;
for
   if(thấy node xóa)
     TH 1 TH 3 TH 2
   else
     giữ = j
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?