01/10/2018, 12:06

Lỗi can thiệp vùng nhớ

void xoa_ten(list &lsv,char *ten)
{
	node *t=NULL;
	for(node *i=lsv.dau;i!=NULL;i=i->next)
	{
		if(strcmpi(i->info.ten,ten)==0)
		{
			if(i==lsv.dau)
			{
				lsv.dau=lsv.dau->next;
				delete i;
			}
		}
	}
}

ko có break sau khi delete là nó lỗi can thiệp vùng nhớ(access violation) tại sao vậy nhỉ ? nếu ko có break thì nó tiếp tục chạy đến khi i = NULL.

Dark.Hades viết 14:16 ngày 01/10/2018

Điều kiện bạn đặt ra nó sẽ chạy liên tục từ thằng đầu tiên tới thằng cuối cùng, ở đâu nó cũng sẽ hợp lệ và nhảy vào đến trong cùng, giá trị của lst bị thay đổi liên tục vì i == lst đầu, mà lst đầu khi if thứ 1 true sẽ gán giá trị mới là con trỏ lst next, => , không cố định, thằng i cũng vì vậy mà vị trí trỏ bộ nhớ của nó cũng trỏ lung tung hết.
=> Thuật toán sai, code lại

node *t=NULL;

Dòng này là gì??

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

dòng đấy chưa del thôi

Khoa NTA viết 14:10 ngày 01/10/2018

Ngay sau khi delete i; rồi thì i=i->next; là không hợp lý :v
Nếu muốn tiếp tục thì phải sao lưu i->next trước rồi mới tiến hành delete i; và gán lại i là node cha của i vừa xóa. Tức là:

// i_prev->next là i hiện tại
if(i==lsv.dau)
{
	// lsv.dau=lsv.dau->next;
	i_prev->next = i->next;
	delete i;
	i = i_prev;
}
chichi viết 14:12 ngày 01/10/2018

Thì delete i đi rồi bước tiếp vòng lặp i->next thế nào được

Bài liên quan
0