안녕하세요 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개일 때 예외처리 까다로워 집니다.
그리고 마지막 요소를 삽입할 때 마다 계산하고 있는데,
캐시하면 좋겠군요.
나중에 iterator 라는 개념을 배우시면
나중에 iterator 라는 개념을 배우시면 아시겠지만,
컨테이너(list, array, vector, set 등의 자료구조)를 구현할 때에는
컨테이너 자체가 삽입/삭제/접근 연산을 제외한 다른 연산이 들어가면
좋지 않습니다. 이 경우엔 출력함수-List::out()-가 되겠죠.
음..
답글주신 iterator은 조금 더 공부를 해봐야겠군요..ㅎ 아직은 말씀이 잘 이해가지 않습니다ㅠㅠ..
와 정말 감사합니다.
정말 감사합니다!
보여주신 코드는 공부하는데 정말 많은 도움이 됐습니다!!!
위에 소스는 틀렸고 이걸로 하시면 됩니다.
아 그렇군요!
매개변수와 멤버변수의 이름이 같아 생긴 문제였군요!
접두사 _을 붙이는것, m_을 붙이는 것 잘 기억해둬야겠어요! ㅎㅎ
out에서도 불필요한 변수가 생성됐군요..ㅎㅎ
평소 코드도 다시한번 돌아봐야겠어요..
ps. 저는 아직도 last를 사용했다는점에 놀라고 있습니다..
Visual Studio 로 디버깅이 가능합니다.
F9 누르시고. F5 F10 F11 누르시면. 값을 확인하실 수 있습니다.
오류가 발생한 이유는 멤버변수인 data 이름이 인자값 이름과 같아서 인경우가 발견 되었습니다.
이제 new로 메모리에 생성을 해주셨으니. delete로 해제'도 해주셔야 합니다. ㅇ_ㅇ;;
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기