30/09/2018, 17:02

Lỗi logic khi xóa Node trùng kiểu dữ liệu trong DSLK?

Mình viết lệnh xóa Node trùng kiểu dữ liệu trong DSLK, ở đây kiểu dữ liệu của mình là số nguyên dương.
Ý tưởng của mình là cho NODE p chạy từ đầu dãy đến cuối dãy, NODE r chạy từ NODE p->Next đến cuối dãy, nếu (p->Data==r->Data) thì xóa NODE r.

void DeleteBy(LIST &L, int pos)
{
	int count = 0;
	NODE p = L.pHead, r = L.pHead;
	while (count < pos - 2)
	{
		p = p->Next;
		count++;
	}
	r = p->Next;
	p->Next = r->Next;
	free(r);
}
void DeleteSameNode(LIST &L)
{
	NODE p = L.pHead, r, t;
	int pos, count = 0;
	while (p != NULL)
	{
		count++;
		pos = count + 1;
		for (r = p->Next; r != NULL;r=r->Next)
		{
			if (p->Data == r->Data)
			{
			t = r;
			DeleteBy(L, pos);
			r = t;
			}
			pos++;
		}
		p = p->Next;
	}
}

Sau khi Debug thì mình phát hiện ra lỗi ở hàm DeleteSameNode. Khi mình xóa NODE r thì cả NODE t cũng bị xóa theo, mình không hiểu tại sao đoạn chương trình lại thực hiện như vậy khi mình đã tách NODE r và NODE t ra thành 2 NODE riêng biệt.
Mọi người giúp mình fix lỗi với. Cảm ơn ^^

lâm phúc tài viết 19:10 ngày 30/09/2018

hiểu rồi, trong hàm dưới bạn cho đk dòng for thành r!=p tại vì nếu làm như bạn thì sau khi phát hiện bằng nó xóa nút đó rồi mà bạn còn truy cập là coi như lỗi, ko thì để thêm 1 con trỏ tạm lưu giá trị tạm là coi như hay nhất

Văn Hồng Hà viết 19:08 ngày 30/09/2018

Mình cho con trỏ t mang giá trị tạm của con trỏ r rồi mà vẫn bị bạn, không biết bị hỏng chỗ nào.
Nhưng mà cũng cảm ơn bạn

lâm phúc tài viết 19:08 ngày 30/09/2018

qua nào ko dc, nhiêu khi bị lỗi chỗ nào đó, theo mình thì bạn nên dẹp hết snag 1 bên đi, cái này lỗi giải thuật thì tốt nhất bạn nên viết lại từ đầu rồi so sánh vs cái cũ để xác định lỗi và rút luôn kinh nghiệm cho lần sau

Bài liên quan
0