Thêm node trong danh sách liên kết đơn

//cho e hỏi hàm thêm node p trước node q ạ…tại sao kia lại phải cap phất cho node h vậy ạ…mà node k trong vòng lặp mình ko phải cấp phát ạ
//
link https://paste.ubuntu.com/25566190/

void ThemNode_p_TruocNode_q(LIST &l, NODE *p)
{
	int x;
	cout << "\nNhap node q: ";
	cin >> x;
	NODE *q = KhoiTaoNode(x);

	NODE *h = new NODE; // <- (*)
	// duyệt từ đầu danh sách để tìm node q cần thêm vào sau 
	for (NODE *k = l.pHead; k != NULL; k = k->pNext)
	{
		if (k->data == q->data)
		{
			NODE *g = KhoiTaoNode(p->data);
			g->pNext = k; // cho node p cần thêm vào sau node q trỏ đến node nằm sau node k <=> cập nhật mối liên kết
			h->pNext = g; // cho node q - cũng chính là node k trỏ đến node p
		}
		h = k;
	}
}

vì k chỉ là biến tạm để duyệt đến vị trí cần tìm
vi dụ
list arr=a-b-c-d-e-g-h
thêm f vào sau e thì tạo biến tạm k=arr.get 0
lặp đến khi k==e
thì cho f.next = k.next
e.next= f

mk chưa rõ lắm nếu đoạn dưới của hàm trên có gán h =k …nếu ko câp phát thì sẽ bị lỗi còn k cũng là 1 node…mà ta ko cần cấp phát nhưng gán k=h thì lại ko lỗi ạ

Code này phải sửa lại đó :slight_smile: đúng ra là node đầu tiên phải xử lí riêng. Sửa xong thì h = k mới đúng chứ gán k = h thì lặp vô tận :smiley: vì h nằm trước k.

1 Like
  • thật ra node h không cần cấp phát nếu như node h bạn sửa lại như bên dưới vẫn chạy được
NODE *h = 0;
  • Mình xin nói thêm là trong trường hợp
NODE *h = new NODE;

sau khi h bị gán bằng k (h=k) thì lúc này bộ nhớ được cấp phát lúc đầu thành bộ nhớ rác không được delete

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?