2012-01-03 23 views
5

Tôi đã thực hành danh sách liên kết đơn trong C++ (thực hành cách tìm nút bắt đầu của danh sách tròn), nhưng thấy việc sử dụng toán tử -> rất khó hiểu. Tôi đang sử dụng Visual Studio 2010 C++ nhanhToán tử -> không hoạt động như mong đợi trong C++

này hoạt động hoàn hảo: head->append(2)->append(3)->append(4)->append(5)

Nhưng điều này không làm việc (để tạo ra một danh sách liên kết hình tròn): head->append(2)->append(3)->append(4)->append(5)->append(head->next)

Khi tôi nhảy vào phương pháp này và debug , có vẻ như head->next không được truyền chính xác vào phương pháp.

Nhưng công trình này:

  1. Node* tail=head->append(2)->append(3)->append(4)->append(5); tail->append(head->next);
  2. Hoặc sau khi tôi thay đổi return c->next-return head trong hai phương pháp, head->append(2)->append(3)->append(4)->append(5)->append(head->next) cũng làm việc.

Tôi thiếu gì ở đây? Cảm ơn bạn!

Chi tiết về mã của tôi là như sau:

void main(){ 
    Node* head=new Node(1); 
    Node* tail=head->append(2)->append(3)->append(4)->append(5)->append(head->next); 
    cin.get(); 
} 

class Node{ 
public: 
    Node* next; 
    int data; 
    bool marked; 

    Node(int d){ 
     data=d; 
     marked=false; 
     next=NULL; 
    } 

    Node* append(int d){ 
     Node* c=this; 
     while(c->next!=NULL){ 
      c=c->next; 
     } 
     c->next=new Node(d); 
     return c->next; 
    } 

    Node* append(Node* n){ 
     Node* c=this; 
     while(c->next!=NULL){ 
      c=c->next; 
     } 
     c->next=n; 
     return c->next; 
    } 
}; 
+1

có phải đó là một kỷ lục mới cho gián tiếp chaining – Mysticial

+0

là UB này bởi bất kỳ cơ hội..? –

+0

@Mysticial - I nghĩ rằng tôi đã sử dụng một chuỗi dài hơn trong một dự án một lần, nhưng tôi đã mất dấu nó. –

Trả lời

10

Bạn đang gặp phải hành vi không xác định.

Vấn đề là bạn đang mong đợi head->next được đánh giá tại một thời điểm cụ thể (ngay trước khi gọi người cuối cùng append(). Nhưng điều đó không được đảm bảo.

+0

Vì vậy, nó không được định nghĩa trong tiêu chuẩn C++, và mọi trình biên dịch có thể diễn giải nó theo cách riêng của chúng? – user1128516

+1

Đúng vậy. Khi thứ tự đánh giá là quan trọng đối với bạn (vì nó ở đây), hãy tách riêng các cuộc gọi đó. –

2

Khi bạn đang đi qua head->next - nó trước khi thay đổi nó với head->append. Tôi sợ bạn đang bối rối thứ tự của văn bản với thứ tự thực hiện.

Trong trường hợp này, bạn đang thay đổi giá trị và đọc nó trong cùng một tuyên bố thực thi, đó là hành vi không xác định.

+0

Cảm ơn bạn! Hiểu rồi. – user1128516

2

head->next được đánh giá đầu tiên. Trình biên dịch là tự do để làm như vậy , xem this question

+0

Tôi hiểu rồi! Cảm ơn bạn – user1128516

0

sở chính> tiếp theo là NULL (không trỏ đến bất cứ điều gì) vào thời điểm đó tuyên bố rằng được đánh giá

+0

Có thể, có thể không. –

+0

Có thể không, nhưng rất có thể. Chúng tôi sẽ phải kiểm tra những gì trình biên dịch kết quả đầu ra để biết chắc chắn, nhưng nó rất có thể nó sử dụng giá trị của đầu-> tiếp theo ở đầu đánh giá toàn bộ tuyên bố. Hàm khởi tạo đặt bên cạnh NULL. –

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