런타임 에러 (AccessNullPointer) 해결방안 부탁드립니다!

조회수 358회
#include <iostream>

typedef int Data;

class _node
{
public:
    _node* next;
    _node* prev;
    Data data;
};

typedef class _node Node;

// 원형 연결 리스트
class _list
{
public:
    Node* head;
    Node* tail;
    Node* cur;
    Data movingCount;  // 총 이동 횟수

    _list()
    {
        head = NULL;
        tail = NULL;
        cur = NULL;
        movingCount = 0;
    }
};

typedef class _list Queue;

// 1부터 n까지 리스트 연결해주는 함수
void QInit(Queue* plist, int n);

// 새로운 노드를 생성해주는 함수 (LInit 함수에서 사용)
void QCreateNode(Queue* plist, Data data);

// 왼쪽 방향으로 num을 찾을 때 이동 횟수
int Qfind_Left(Queue* plist, Data num);

// 오른쪽 방향으로 num을 찾을 때 이동 횟수
int Qfind_Right(Queue* plist, Data num);

// 왼쪽, 오른쪽 비교하고 더 작은 거 더해주는 함수
void Qcompare(Queue* plist, Data num);

// num을 찾고 제거하고 다시 연결해주는 함수
void Qdelete(Queue* plist, Data num);

int main()
{
    int N, M, findNum;
    Queue q;

    std::cin >> N >> M;

    QInit(&q, N);

    for (int i = 0; i < M; i++)
    {
        std::cin >> findNum;
        Qdelete(&q, findNum);
    }

    std::cout << q.movingCount << '\n';

    return 0;
}

void QInit(Queue* plist, int n)
{
    for (int i = 1; i <= n; i++)
    {
        QCreateNode(plist, i);
    }
}

void QCreateNode(Queue* plist, Data data)
{
    Node* newNode = new Node;
    newNode->data = data;

    // 첫번째 노드 생성
    if (plist->head == NULL)
    {
        plist->head = newNode;
        plist->tail = newNode;
        newNode->next = newNode;
    }
    else // 두번째 노드를 생성할 때로 진입
    {
        // 이중 연결 리스트
        newNode->prev = plist->tail;
        plist->tail->next = newNode;
        plist->tail = newNode;

        // 원형 연결 리스트
        plist->head->prev = plist->tail;
        plist->tail->next = plist->head;
    }
}

int Qfind_Left(Queue* plist, Data num)
{
    int leftCount = 0;
    plist->cur = plist->head;

    for (Queue* q = plist; q->cur->data != num; q->cur = q->cur->prev)
    {
        leftCount += 1;
    }

    return leftCount;
}

int Qfind_Right(Queue* plist, Data num)
{
    int rightCount = 0;
    plist->cur = plist->head;

    for (Queue* q = plist; q->cur->data != num; q->cur = q->cur->next)
    {
        rightCount += 1;
    }

    return rightCount;
}

void Qcompare(Queue* plist, Data num)
{
    int leftCount = Qfind_Left(plist, num);
    int rightCount = Qfind_Right(plist, num);

    // 더 작은 횟수를 더해준다.
    if (leftCount >= rightCount)
        plist->movingCount += rightCount;
    else
        plist->movingCount += leftCount;
}

void Qdelete(Queue* plist, Data num)
{
    // 왼쪽과 오른쪽을 비교한다.
    // 더 작은 수를 plist->movingCount에 더한다.
    Qcompare(plist, num);

    // 그리고 현재 노드의 다음 노드를 head로, 현재 노드의 이전 노드를 tail로 바꿔준다.
    // 그리고 현재 노드를 제거한다.
    // 연결 리스트를 이어준다.

    Node* delNode = plist->cur;

    plist->tail = plist->cur->prev;
    plist->head = plist->cur->next;

    plist->tail->next = plist->head;
    plist->head->prev = plist->tail;

    delete delNode;
}

런타임 에러 (AccessNullPointer)가 발생하는데 어디서 이 오류가 발생하는지 감이 잘안와서 질문 올립니다..!!

참고로 알고리즘 문제는 백준에서 가져왔씁니다.>!! https://www.acmicpc.net/problem/1021

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

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

(ಠ_ಠ)
(ಠ‿ಠ)