2013-10-27 1 views
-4

C++의 링크 된 목록에 문제가 있습니다. 나는 클래스는 그렇게 찾고있다 :C++의 링크 된 목록

class list { 
    private: struct node { 
     node * next; 
     int val; 
    }; 
    node * head; 
    node * current; 
    public: list(); 
    list(const list & l); 
    list & operator = (const list & l);~list(); 
    void insert(int a); 
    void goToHead(); 
    int getCurrentData(); 
    void advance(); 
    bool moreData(); 
}; 

내가 그러나 연산자의 선언이 내가 제대로 작동하는지 확인 해요, 여기에 모든 기능을 설명 못해 =

list & list::operator = (const list & l) { 
    if (& l == this) return *this; 
    current = NULL; 

    node * src, * * dst; 
    head = (* this).head; 

    src = l.head; 

    dst = & head; 
    while (src) { 
     if (!(* dst)) { * dst = new node; 
     } 
     (* dst) - > val = src - > val; 

     if (src == l.current) current = * dst; 
     src = src - > next; 

     dst = & ((* dst) - > next); 
    } 
    while ((* dst) != NULL) { 
     node * t = (* dst) - > next; 
     delete * dst; 
     (* dst) = t; 
    } 
    return *this; 
} 

은 복사 할 수있다 값을 하나의 목록에서 다른 노드를 추가하거나 필요하면 삭제하십시오. 그것은 목록이 동일하거나 두 번째 노드가 더 길기 때문에 작동합니다 (따라서 노드를 삭제해야합니다). 노드가 몇 개 추가되어야합니다.

==4582== Conditional jump or move depends on uninitialised value(s) 
==4582== at 0x8048C52: list::operator=(list const&) (list.cpp:103) 
==4582== by 0x804891B: main (testlist.cpp:38) 
==4582== Uninitialised value was created by a heap allocation 
==4582== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==4582== by 0x8048BDE: list::operator=(list const&) (list.cpp:93) 
==4582== by 0x804891B: main (testlist.cpp:38) 

이 선언문에 어떤 문제가 있는지 잘 모르겠습니다. 도움을 청합니다.

죄송합니다. 형식이 잘못 되었다면 크롬 문제가 생겼습니다. 그 이유가 여기 있습니다. 어쩌면 예제가 있지만이 예제를 사용해야하는데, 이런 식으로해야 할 작업이있었습니다. 예제 코드가있어서 그냥 완료해야했습니다.

* dst = new node; 

그리고 103 만 마지막 닫는 대괄호 도움을

} 

다시 덕분입니다 : 93입니다 라인 : 난 여전히 같은 문제가 있습니다.

+3

코드를 올바르게 포맷하십시오. 누구도'/ dev/random'의 출력처럼 보이는 코드를 읽지 않을 것입니다. – rightfold

+0

링크 된 목록을 올바르게 가져 오는 방법에 대해 많은 예제가 있습니다. 다시 묻지 않아도됩니다. –

+0

@ not-rightfold done : –

답변

0
  1. 코드와 마크 (93) 및 (103)를 포맷하십시오
  2. 라인 (93)

    * DST = 새로운 노드 인 경우;

103

node *t=(*dst)->next; 

(새을 한 후에) NULL 옆에> dst- 전송에 당신이 할 수 있습니다 그렇지 않으면이 초기화되지 않은 메모리를 가리 킵니다.

+0

그래도 상황에 따라 문제가 발생할 수 있지만 이번에는 문제가되지 않을 수 있습니다.이 삭제를하지 않아도 잘 작동하므로 다른 것이되어야합니다. – user2511527