Tôi gặp phải lỗi lạ trong một số bài tập về nhà khiến tôi tạo một chồng với một danh sách được liên kết. Tất cả các chức năng trong chương trình của tôi hoạt động hoàn hảo, ngay cả khi bắt đầu khi tôi không có nút, hoặc sau khi xóa một vài nút. Nhưng khi tôi tạo ra các nút và xóa chúng tất cả, vì vậy tôi trở về không, sau đó mọi chức năng gây ra một vụ tai nạn. Tôi đã cố gắng nghiên cứu vấn đề, nhưng các giải pháp tôi đã tìm thấy gần như giống hệt với những gì tôi đã có, vì vậy rõ ràng là có một cái gì đó quan trọng tôi không nhìn thấy.Chức năng xóa nút danh sách liên kết của tôi khiến các phần khác của chương trình của tôi bị lỗi
Dưới đây là chức năng xoá nút (một trong những tôi nghi ngờ là thủ phạm trong tất cả điều này)
void remove(node** root)
{
node* temp = *root;
node* previous = 0;
if(*root)
{
while((*root)->next)
{
previous = *root;
*root = (*root)->next;
}
delete *root;
*root = temp;
if(previous)
{
previous->next = 0;
}
}
else
{
std::cout<<"cannot delete items from empty list\n";
}
}
Dưới đây là các chức năng nút chèn
void insert(node** root)
{
node* temp = *root;
if(*root)
{
while((*root)->next)
{
(*root) = (*root)->next;
}
(*root)->next = new node;
(*root)->next->data = getnum();
(*root)->next->next = 0;
*root = temp;
}
else
{
(*root) = new node;
(*root)->data = getnum();
(*root)->next = 0;
}
}
Tôi khá chắc chắn rằng vấn đề này là ở đâu đó trong mã mà tôi đã liên kết, nhưng chỉ trong trường hợp không có, thì đây là ghi chú cho toàn bộ nhiệm vụ http://pastebin.com/AWtG4qjD
Tôi không thấy gì sai. Nó làm gì khi bạn chạy nó dưới valgrind? Các vấn đề về kiểu: không sử dụng '* root' làm biến lặp của bạn, điều này gây nhầm lẫn. Đặc biệt là không làm điều đó khi bạn cần phải đặt lại nó về giá trị ban đầu sau khi lặp lại của bạn. Và ** đặc biệt là ** không gọi giá trị ban đầu đó là "temp" (nó không phải là một cái gì đó tạm thời, đó là danh sách thực tế đang được sửa đổi!). Ngoài ra: tại sao bạn lặp lại đến cuối của chỉ để chèn hoặc xóa ở cuối? Tại sao không lưu trữ danh sách theo thứ tự ngược lại và hoạt động trực tiếp trên đầu trong thời gian không đổi? –
là một phần của bài tập. Những gì bạn gợi ý có vẻ như là một cách tốt hơn để làm mọi thứ, nhưng vì đây là lần đầu tiên tôi chuyển nhượng danh sách liên kết, tôi nghi ngờ tôi được yêu cầu làm một cách có chủ ý để giúp tôi học tốt hơn. Tôi thực sự là một lập trình viên khá mới, vì vậy tôi đã không thực sự làm việc ra làm thế nào để làm sạch và gọn gàng tìm kiếm mã, vì vậy lời khuyên phong cách là rất đánh giá cao. Trên cùng một lưu ý, tôi không thực sự biết valgrind là gì, nhưng tôi googling nó và có vẻ thú vị – kamstack