2012-07-20 23 views
5

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

+1

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? –

+0

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

Trả lời

5

remove triển khai không phải là corre ct.Suppose danh sách có một phần tử. Trong trường hợp này temp sẽ trỏ đến "bộ nhớ không tồn tại" sau khi bạn thực hiện delete *root; Tuy nhiên những gì bạn đang làm là *root = temp; theo cách này bạn gây gốc để trỏ đến nút không hợp lệ. Và điều này gây ra những hành vi kỳ lạ sau Cách thể làm cho thực hiện của bạn đúng là:

void remove(node** root) 
{ 
    //TODO: your code here 
    node* temp = *root; 
    node* previous = 0; 
    if(*root) 
    { 
     while((*root)->next) 
     { 
      previous = *root; 
      *root = (*root)->next; 
     } 
     delete *root; 
     if(previous) 
     { 
      *root = temp; 
      previous->next = 0; 
     } 
     else { 
      *root = NULL; 
     } 
    } 
    else 
    { 
     std::cout<<"cannot delete items from empty list\n"; 
    } 
} 

Nhưng tôi don `t khuyên bạn nên lặp danh sách với con trỏ gốc .Define một số iterator và tìm kiếm cuối với thay vì thay đổi * gốc

+0

mà dường như đã được vấn đề, cảm ơn một bó cho tip của bạn! – kamstack

Các vấn đề liên quan