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;
}
Bài liên quan
ở trong
delete j;
rồi thì làm sao mà vòng lặp for nó chạyj = j->pNext
được nữakhi ở 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
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ữ