01/10/2018, 00:57
Làm sao để xóa một node có dữ liệu data là kiểu struct trong danh sách liên kết đơn?
Mình phải làm bài tập liên quan đến xóa một node có cấu trúc struct là vé tàu. Nhưng khi duyệt các node xem có dữ liệu nào trùng vs dữ liệu cho trước không thì mình nó lại báo lỗi ở câu k->data=q->data trong đó k và q là hai node. q là node chứa dữ liệu nhập vào để duyệt.
Bài liên quan
đây là code của mình
trong hàm xoacuoi() thì p chưa được gán giá trị (p chưa trỏ vào đâu) mà gọi p->next=NULL; sao được @_@ Hơn nữa dslk đơn thì ko nên có hàm xóa cuối. Thêm đầu, thêm cuối, xóa đầu là đủ rồi.
còn cái hàm xóa sau 1 node thì cung cấp Nodevetau* để so sánh làm gì? Sao ko cung cấp hẳn luôn 1 cái vé tàu v chẳng hạn? Vì so sánh k->data == q->data thì có khác gì k->data == v. Hàm xóa sau 1 node chỉ đơn giản là xóa sau node đó là đủ. Đâu có cần cung cấp thêm Q làm gì…
p đã được gán giá trị bằng Q->tail rồi mà. làm như thế để chặt đứt mối liên hệ với node cần xóa, biến p (node trước node cần xóa) trở thành node cuối cùng
tại vì mình làm hai hàng đợi cho nên phải cung cấp thêm Q thì nó mới hiểu >.<
bạn ghi
Q->tail=p;
mà?? p có được gán cho cái gì đâu. Xóa đuôi ko phải là tìm node tail, mà tìm node đứng trước tail mới đúng. Phải kiểm traif (k->next == Q->tail)
rồi sau đó xóa tail, gán tail bằng k, k->next = NULL.mỗi lần xóa tail lại phải lướt tất cả các phần tử trong dslk, vậy thì quá tốn công so với xóa đầu/thêm đầu/thêm đuôi.
đáng lẽ ko có thêm đuôi luôn. Có thêm đuôi thì phải có thêm node tail, hàm xóa sau 1 node phải kiểm tra xem node sau đó có phải tail ko nữa, nếu là tail thì phải trỏ tail lại cho đúng, tốn thời gian nữa.
cái dòng cuối cùng của mình trong hàm là gán p=k; đó thôi. nếu k=Q-> tail tức là k là node cuối cùng, thì p sẽ là node trước node đó do chạy vòng lặp for.
như vậy vẫn bị lỗi khi dslk chỉ có 1 phần tử, gọi xóa cuối sẽ lỗi ngay vì câu lệnh if sẽ trả về true ngay lập tức
thì nó đã có hàm xóa đầu rồi mà >.<. quan trọng làm cái hàm xóa một khóa bất kỳ thôi, 3 hàm kia sẽ nằm trong cái hàm đó để xử lý mọi trường hợp
ý tưởng của mình là chưa biết cái node trước node cần xóa là node nào cơ. Chỉ biết node cần xóa có dữ liệu là data cũng chưa biết nó nằm ở đâu. phải tìm ra node cần xóa đó và node nằm trước nó để thực hiện xóa.
ý tưởng đúng rồi, nhưng:
xét 1 hồi dễ khùng lắm.