01/10/2018, 15:56

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 << "
Nhap 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 << "
Nhap hinh chu nhat: " << endl << endl;
	cout << "Nhap diem tren: ";
	NhapDiem(x.Tren);
	cout << "
Nhap diem duoi: ";
	NhapDiem(x.Duoi);
	DienTich(x);
}
void XuatDiem(Diem a)
{
	cout << "Diem (" << a.x << "," << a.y << ")" << endl;
}

void XuatHCN(HCN a)
{
	cout << "
Hinh 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;
}
viết 18:08 ngày 01/10/2018

ở 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

Nguyễn Tấn Tài viết 18:09 ngày 01/10/2018

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

Nguyễn Phú Thành viết 18:05 ngày 01/10/2018

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
Bài liên quan
0