안녕하세요 C++로 링크드 리스트를 구현중에 문제가 생겨 질문 납깁니다..

kikiki0611의 이미지

노드 클래스를 만들고,
리스트 클래스에서 삽입연산을 했는데요,
아래와 같이 작성했더니 아웃풋에 쓰레기값이 나오네요..
어디가 문제일까요?ㅠㅠ

#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;
}
twinwings의 이미지

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 ++;
        }
};
twinwings의 이미지

나중에 iterator 라는 개념을 배우시면 아시겠지만,

컨테이너(list, array, vector, set 등의 자료구조)를 구현할 때에는

컨테이너 자체가 삽입/삭제/접근 연산을 제외한 다른 연산이 들어가면

좋지 않습니다. 이 경우엔 출력함수-List::out()-가 되겠죠.

kikiki0611의 이미지

답글주신 iterator은 조금 더 공부를 해봐야겠군요..ㅎ 아직은 말씀이 잘 이해가지 않습니다ㅠㅠ..

kikiki0611의 이미지

정말 감사합니다!
보여주신 코드는 공부하는데 정말 많은 도움이 됐습니다!!!

twinwings의 이미지

#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;
}
kikiki0611의 이미지

매개변수와 멤버변수의 이름이 같아 생긴 문제였군요!
접두사 _을 붙이는것, m_을 붙이는 것 잘 기억해둬야겠어요! ㅎㅎ
out에서도 불필요한 변수가 생성됐군요..ㅎㅎ
평소 코드도 다시한번 돌아봐야겠어요..

ps. 저는 아직도 last를 사용했다는점에 놀라고 있습니다..

shint의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.