c++ linked list 중복제거, 역순 질문입니다.

조회수 2833회

단순링크드리스트에서 중복된 데이터를 갖는 리스트가 있으면 지우는 소스입니다. IsEmpty()는 리스트가 0인지 여부를 묻는 bool형 함수이고 Length()는 리스트의 길이를 체크하는 함수입니다. Delete(int Position) 함수는 지정된 위치(Position 정수)의 리스트를 제거 하는 함수입니다. 이 함수들은 전부 잘 작동 되는데 중복제거 함수인 deDuplicate() 함수가 문제가 있네요... 하다하다 왜 안되는지 모르겠는데 계속 오류나면서 팅겨서 질문합니다..

void listClass::deDuplicate()
{
    if (IsEmpty() || Length()==1)
        cout << "not enough list" << endl;
    else
    {
        Nptr temp = Head;
        Nptr temp2 = Head;
        temp2 = temp2->Next;
        for (int i = 0; i < Count; i++)
        {
            temp = temp->Next;
            for (int j = 0; j < Count-1; j++)
            {
                temp2 = temp2->Next;
                if (temp->Data == temp2->Data) {
                    Delete(j+2);
                    Count -= 1;
                }
            }
        }
    }
}

클래스 입니다.

typedef struct nodeRecord
{
    int Data;
    struct nodeRecord* Next;
}node;

typedef node* Nptr;

class listClass
{
public:
    listClass();
    listClass(const listClass& L);
    ~listClass();
    void Insert(int Position, int Item);
    void Delete(int Position);
    void Retrieve(int Position, int *ItemPtr);
    void Init();
    bool IsEmpty();
    int Length();
    void printlist();
    void deDuplicate();
    //void reverse();
private:
    int Count;
    Nptr Head;
}; 

reverse 함수는 정렬된 리스트를 역순으로 연결하는 함수인데... 도대체 어떻게 연결을 시작해서 마무리를 지어야 할지 도저히 모르겠네요 혹시 이부분도 도와주실수 있으시다면 부탁드립니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 세그멘테이션 폴트 맞는것 같네요.

    for문들의 루프 횟수가 잘못되었고, (주석1,주석3)

    temp2가 두번째 루프문이 끝나고 초기화되지 않고 있습니다.(주석2)

    else
    {
        Nptr temp = Head;
        Nptr temp2 = Head;
        for (int i = 0; i < Count-1; i++)//주석1
        {
            temp2 = temp;//주석2
            for (int j = 0; j < Count-i-1; j++)//주석3
            {
                temp2 = temp2->Next;
                if (temp->Data == temp2->Data) 
                {
                    Delete(j+2);
                    Count -= 1;
                }
            }
            temp = temp->Next;
        }
    }
    
    

    이해 안되시는 부분 있으면 댓글로 달아주세요.

    reverse는 현재node를 가리키는 pointer의 next에 이전node의 주소를 넣어주고, pointer의 값을 다음 노드로 바꿔주는것을 반복하면 됩니다. 여기서, 현재node에서 이전node에 접근할 수 없고, 현재node의 next에 이전node의 주소를 넣어주면, 다음 node에 접근할 수 없습니다. 그래서 여러개의 포인터가 필요합니다.

    마지막으로 개인적으로 저는 LinkedList에서 아래 같이 Count대신에 next가 Null인지 아닌지로 LinkedList의 끝을 판별해서 루프문을 사용하는게 코딩하기 더 쉬었던것 같습니다.

    while(temp->next != Null)
        temp=temp->next;
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)