안녕하세요 C++로 링크드 리스트를 구현중에 문제가 생겨 질문 납깁니다..
      글쓴이: kikiki0611 / 작성시간: 월, 2016/04/25 - 2:49오후    
  
  노드 클래스를 만들고,
리스트 클래스에서 삽입연산을 했는데요,
아래와 같이 작성했더니 아웃풋에 쓰레기값이 나오네요..
어디가 문제일까요?ㅠㅠ
#include <iostream>
using namespace std;
 
class Node {
    public:
        int data;
        Node *next;
 
        Node(){
            next = NULL;
            data = 0;   
        }       
        Node(int data){
            next = NULL;
            data = data;   
        }
};
 
class List {
    public:
        int length;
        Node *head;
 
        List(Node *node){
            length = 0;
            head = node;
        }
        void out(){
            Node *tmp = head;
            for(int i = 0 ; i < length; i++){
                tmp = tmp->next;
                cout<<tmp->data;
            }
 
        }
        void insert(int data){
            Node *tmp = head;
            Node *newN = new Node(data);
            for(int i = 0 ; i < length; i++){
                tmp = tmp->next;       
            }
            tmp->next = newN;
            length ++;
        }
};
 
 
int main ( void ) {
    Node *node = new Node(0);
    List *list = new List(node);
    list->insert(10);
    list->insert(12);
    list->insert(13);
    list->out();
    return 0;
}Forums: 


head를 포인터가 아니라 객체로
head를 포인터가 아니라 객체로 생성하세요.
안그러면 개수가 0개일 때 예외처리 까다로워 집니다.
그리고 마지막 요소를 삽입할 때 마다 계산하고 있는데,
캐시하면 좋겠군요.
class List { public: int length; Node head; Node *last; List() :head(0) { length = 0; last = &head; } void out(){ for(Node *tmp = &head; tmp != NULL; // 또는 tmp; tmp = tmp->next) { tmp = tmp->next; cout<<tmp->data; } } void insert(int data){ Node *newN = new Node(data); last->next = newN; last = newN; length ++; } };나중에 iterator 라는 개념을 배우시면
나중에 iterator 라는 개념을 배우시면 아시겠지만,
컨테이너(list, array, vector, set 등의 자료구조)를 구현할 때에는
컨테이너 자체가 삽입/삭제/접근 연산을 제외한 다른 연산이 들어가면
좋지 않습니다. 이 경우엔 출력함수-List::out()-가 되겠죠.
음..
답글주신 iterator은 조금 더 공부를 해봐야겠군요..ㅎ 아직은 말씀이 잘 이해가지 않습니다ㅠㅠ..
와 정말 감사합니다.
정말 감사합니다!
보여주신 코드는 공부하는데 정말 많은 도움이 됐습니다!!!
위에 소스는 틀렸고 이걸로 하시면 됩니다.
#include <iostream> using namespace std; class Node { public: int data; Node *next; // 매개변수가 하나도 없는 생성자의 경우 // 기본 매개변수를 넣어줌으로서 생략할 수 있습니다. Node(int data = 0){ next = NULL; // 여기서 멤버변수가 // 지역변수에 의해 가려져서 그렇습니다. // 멤버변수 앞에 m_ 과 같은 접두어를 넣던가 // 멤버함수의 argument에 _data 혹은 data_ 등의 접두어/접미사를 // 넣으세요. (다른 라이브러리에 많이 쓰는 접두어/접미사 입니다.) this->data = data; } }; class List { public: int length; Node head; Node *last; // 캐쉬를 위한 멤버변수입니다. List() :head(0) { length = 0; last = &head; } void out(){ // 질문자의 소스의 경우 // 지역변수 두개 - tmp, i -가 갱신됩니다. // 사실 tmp 하나만 갱신되도 됩니다. for(Node *tmp = head.next; tmp != NULL; tmp = tmp->next) { cout << tmp->data << endl; } } void insert(int data){ Node *newN = new Node(data); last->next = newN; last = newN; length ++; } }; int main ( void ) { List *list = new List(); list->insert(10); list->insert(12); list->insert(13); list->out(); return 0; }아 그렇군요!
매개변수와 멤버변수의 이름이 같아 생긴 문제였군요!
접두사 _을 붙이는것, m_을 붙이는 것 잘 기억해둬야겠어요! ㅎㅎ
out에서도 불필요한 변수가 생성됐군요..ㅎㅎ
평소 코드도 다시한번 돌아봐야겠어요..
ps. 저는 아직도 last를 사용했다는점에 놀라고 있습니다..
Visual Studio 로 디버깅이 가능합니다.
F9 누르시고. F5 F10 F11 누르시면. 값을 확인하실 수 있습니다.
오류가 발생한 이유는 멤버변수인 data 이름이 인자값 이름과 같아서 인경우가 발견 되었습니다.
Node(int data){ next = NULL; data = data; }Node(int ndata){ next = NULL; data = ndata; }이제 new로 메모리에 생성을 해주셨으니. delete로 해제'도 해주셔야 합니다. ㅇ_ㅇ;;
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기