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ỏ
tempcù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 nodepnữa là ok.Nếu chỉ xóa 1 phần tử thôi thì
breakluô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
tempsau khi xét nodephiệ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 = psẽ đượ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
ptrỏ đến node tiếp theo(p = p->next), nêntempsẽ là node trước đó củapcho đế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ử.