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


단순링크드리스트에서 중복된 데이터를 갖는 리스트가 있으면 지우는 소스입니다. 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 함수는 정렬된 리스트를 역순으로 연결하는 함수인데... 도대체 어떻게 연결을 시작해서 마무리를 지어야 할지 도저히 모르겠네요 혹시 이부분도 도와주실수 있으시다면 부탁드립니다.

  • 2017년 10월 09일에 작성됨

  • 에러 내용이 뭔가요? 혹시 세그멘테이션 폴트인가요?    정한슬   2017.10.9 22:09     
조회수 296


1 답변


좋아요
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;
  • 2017년 10월 09일에 작성됨
    기계공학과에서 코딩을 배우고 있는 대학생입니다. 아직 부족한 실력이니 많이 도와주세요. 그리고 제가 도움 드릴 수 있는게 있으면 가능한 도와드리고 싶습니다.

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close