30/09/2018, 19:58
xóa phần tử bất kỳ trong danh sách liên kết đơn
Em có đồ án liên quan đến cấu trúc sách,trong đó có yêu cầu xóa sách.Yêu cầu chỉ dừng lại xóa node đầu hoặc cuối là đủ,và em đã làm xong rồi.Nhưng em muốn nâng cấp lên 1 tí,cụ thể là xóa sách theo ID.Em muốn nhập vào ID và duyệt danh sách sách liên kết đơn nếu gặp thì xóa node đó,nhưng em không biết làm sao để định vị được node trước nó???
void xoa(list l)
{
int id;
printf_s("nhap ID sach can xoa: "); scanf_s("%d", &id);
for (node*p = l.phead; p; p = p->pnext)
{
if (p->key.ID == id)
{
}
}
}
Bài liên quan
Bạn cần một biến tạm để lưu node trước đó, chẳng hạn
Bạn dùng 1 con trỏ
temp
cùng kiểu để lưu node phía trước node đang xét, khi gặp id cần xóa (nodep
) thì lấytemp->next = p->next
. Xong rồi giải phóng nodep
nữa là ok.Nếu chỉ xóa 1 phần tử thôi thì
break
luôn, còn không thì phải gánp = temp->next
để xét tiếpdạ.cũng chính là vấn đề của em,không biết làm sao để định vị được nó,chứ gán temp->next=p->next thì em biết rồi.vấn đề làm sao xác định cái node temp ạ?
Chia làm các trường hợp sau:
đến đây coi như hoang thành hàm xoá
xác định
temp
sau khi xét nodep
hiện tại ấy. Mình chỉ lưu lại node trước của node đang xét thôi ànode *temp=NULL; For (node *p = list.head; p->next != NULL; p = p->next) { // xử lý ..... temp = p; }
cái này là node temp = vs node p chứ đâu phải node temp là node đứng trước node p đâu ạ?
Bạn chưa hiểu rõ cách chương trình chạy rồi, lệnh
temp = p
sẽ được đặt ở cuối cùng của vòngfor
, trước các lệnh xử lý so sánh và xóa node.Đến vòng lặp tiếp theo
p
trỏ đến node tiếp theo(p = p->next)
, nêntemp
sẽ là node trước đó củap
cho đến khi gặp câu lệnhtemp = p
.Bằng vào cuối vòng lặp mà, lúc p= p->next thì temp sẽ là node trước của p hiện tại, bởi vậy mình mới để temp=p ở cuối
Cám ơn các tiền bối,để em thử.