Nhờ người trợ giúp về DSLK :)

có vài vấn đề em muốn hỏi mọi người :slight_smile: mong được giúp đỡ.
thứ nhất là: em đang làm hàm xóa 1 phần từ cuối danh sách(Chỉ làm dựa theo hướng dẫn tương tự của thầy) nên không biết là có đúng không ?

int removeHead(LIST &l) // Tương tự xóa đầu :v 
{
	NODE *p;
	int x;
	// Kiem tra danh sach l co rong khong truoc khi xoa?
	if(l.pTail != NULL)
	{
		p = l.pTail;
		x = p->data;
		l.pTail = l.pTail->pNext;// Cập nhật lại pTail mới
		delete p;// kiểm tra sau khi xóa có rỗng ko ?
		if(l.pHead == NULL)
			l.pTail = NULL;
	}
	return x;
}

// Thứ 2 là: em mới học về danh sách liên kết nên còn mơ hồ(đã đọc định nghĩa) nhưng chưa biết vận dụng ntn

1 Like

hàm cập nhập l.ptail có vấn đề chạy chương trình sẽ không ra đúng kết quả.
điều kiện kiểm tra đầu có rỗng không nên để ngoài if(ptail!= null) vì để trong hàm sẽ bị sai.
danh sách rỗng khi tail và head đều rỗng.

void deltail(){ // xoa node cuoi
if(a.head==NULL) return;

	if (a.head == a.tail) {
		delhead();
		return ;
	}
	
	for (node *p = a.head ; p!= NULL  ; p = p->next){
		if (p->next == a.tail  ){
			node *temp = a.tail;
			p->next = a.tail->next;
			a.tail = p;
			delete temp;
			break;
		}
	}
}
1 Like

vậy có nghĩa là kiểm trả xem nếu pHead = null hoặc phead= ptail(chỉ có 1 node) thì return.
nếu không thì cho nó chạy từ đầu tới cuối rồi gán 1 biến tạm bằng node cuối(Tail). còn cái đoạn sau ý nghĩa nó ntn có thể giải thích cho em hiểu thêm được không :slight_smile:

Danh sách liên kết giống như 1 sợi xích thôi, mỗi phần tử là 1 mắt xích, cứ tưởng tượng như thế thì yêu cầu nào cũng giải quyết dễ dàng mà không lo bị rối

void XoaCuoi(LIST &l)
{
      NODE *p;
      for(NODE *k = l.pHead; k != NULL; k = k->pNext)
      {
           if(k == l.pTail)
           {
                l.pTail = p;
                l.pTail->pNext = NULL;
                delete k;
                return;
           }
           p = k;
       }
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?