Các dạng xóa phần tử trong danh sách liên kết đôi

XÓA ĐẦU DANH SÁCH

int removeHead (DList &l)
{
if( l.pHead == NULL) return 0;
DNode *p = l.pHead;
l.pHead = l.pHead->pNext;
l.pHead->pPrev = NULL;
delete p;
if (l.pHead == NULL) l.pTail = NULL;
else l.pHead->pPrev = NULL;
return 1;
}

XÓA CUỐI DANH SÁCH

int removeTail (DList &l)
{
if(l.pTail == NULL) return 0;
DNode *p = l.pTail;
l.pTail = l.pTail->pPrev;
l.pTail->pNext = NULL;
delete p;
if (l.pHead == NULL) l.pTail = NULL;
else l.pHead->pPrev = NULL;
return 1;

XÓA PHẦN TỬ SAU Q

int removeAfter (DList &l, DNode *q)
{
if(q == NULL) return 0;
DNode *p = q ->pNext ;
if (p != NULL)
{
q->pNext = p->pNext;
if (p == l.pTail) l.pTail = q;
else p->pNext->pPrev = q;
delete p;
return 1;
}
else return 0;
}

XÓA PHẦN TỬ TRƯỚC Q

int removeBefore (DList &l, DNode *q)
{
if(q == NULL) return 0;
DNode *p = q ->pPrev;
if(p != NULL)
{
q->pPrev = p->pPrev;
if (p == l.pHead) l.pHead = q;
else p->pPrev->pNext = q;
delete p;
return 1;
}
else return 0;
}

XÓA PHẦN TỬ CÓ KHÓA LÀ k

int removeNode (DList &l, int k)
{
DNode *p = l.pHead;
while (p != NULL)
{
if (p->data== k) break;
p = p->pNext;
}
if (p == NULL) return 0; // Không tìm thấy k
DNode *q = p->pPrev;
if (q != NULL) // Xóa nút p sau q
return removeAfter (l, q);
else // Xóa p là nút đầu ds
return removeHead (l);
}
 DSLK đôi về mặt cơ bản có tính chất giống như DSLK đơn   Tuy nhiên DSLK đôi có mối liên kết hai chiều nên từ một phần tử bất kỳ có thể truy xuất một phần tử bất kỳ khác
Trong khi trên DSLK đơn ta chỉ có thể truy xuất đến các phần tử đứng sau một phần tử cho trước
Điều này dẫn đến việc ta có thể dễ dàng hủy phần tử cuối DSLK đôi, còn trên DSLK đơn thao tác này tốn chi phí
Bù lại, xâu đôi tốn chi phí gấp đôi so với xâu đơn cho việc lưu trữ các mối liên kết. Điều này khiến việc cập nhật cũng nặng nề hơn trong một số trường hợp. Như vậy ta cần cân nhắc lựa chọn CTDL hợp lý khi cài đặt
cho một ứng dụng cụ thể

Share this

Related Posts

Previous
Next Post »