본문 바로가기
공부

[C++] 연결리스트(Linked List) 구현

by MY블로그 2023. 4. 24.

이번과제로 연결리스트를 구현하는 과제가있었다.

push front, pop front

push back, pop back

insert, erase

를 구현하는 것이었다..

혼자서 해결 다 할수 없었다.. 인터넷도 찾아보고 여러가지 코드들을 써보기도하고.

템프릿을 사용하지않게되었다... 템플릿을 사용해서 구현하는것은 다음 수업때 집중해서 확인해야겠다.

#include <iostream>
#include <Windows.h>
using namespace std;

class LinkedList
{
private:
    struct Node 
    {
        int data;
        Node* next;
    };
    Node* head;
    int size;

public:
    LinkedList() 
    {
        head = nullptr;
        size = 0;
    }

    ~LinkedList() 
    {
        Node* current = head;
        while (current != nullptr) 
        {
            Node* next = current->next;
            delete current;
            current = next;
        }
    }

    int getSize() const 
    {
        return size;
    }

    void print() const 
    {
        if (head == nullptr) 
        {
           cout << "리스트가 비어있습니다." << endl;
        }
        else 
        {
            Node* current = head;
            while (current != nullptr) 
            {
                cout << current->data << " ";
                current = current->next;
            }
            cout << endl;
        }
    }

    void pushFront() 
    {
        Node* newNode = new Node;
        cout << "데이터 입력 : ";
        cin >> newNode->data;

        newNode->next = head;
        head = newNode;
        size++;
    }

    void popFront() 
    {
        if (head == nullptr) 
        {
            cerr << "리스트가 비어있습니다." << endl;
            Sleep(1000);
            return;
        }
        Node* temp = head;
        head = head->next;
        delete temp;
        size--;
    }

    void pushBack() 
    {
        Node* newNode = new Node;
        cout << "데이터 입력 : ";
        cin >> newNode->data;

        if (head == nullptr) 
        {
            head = newNode;
            newNode->next = nullptr;
        }
        else {
            Node* temp = head;
            while (temp->next != nullptr) 
            {
                temp = temp->next;
            }
            temp->next = newNode;
            newNode->next = nullptr;
        }
        size++;
    }

    void popBack() 
    {
        if (head == nullptr) 
        {
            cerr << "리스트가 비어있습니다." << endl;
            Sleep(1000);
            return;
        }
        else if (head->next == nullptr) 
        {
            delete head;
            head = nullptr;
        }
        else 
        {
            Node* temp = head;
            while (temp->next->next != nullptr) 
            {
                temp = temp->next;
            }
            delete temp->next;
            temp->next = nullptr;
        }
        size--;
    }

    void insert(int index) {
        if (index < 0 || index > size) 
        {
            cerr << "잘못입력하였습니다." << endl;
            Sleep(1000);
            return;
        }

        Node* newNode = new Node;
        cout << "데이터 입력 : ";
        cin >> newNode->data;

        if (index == 0) 
        {
            newNode->next = head;
            head = newNode;
        }
        else if (index == size) 
        {
            Node* temp = head;
            while (temp->next != nullptr) 
            {
                temp = temp->next;
            }
            temp->next = newNode;
            newNode->next = nullptr;
        }
        else 
        {
            Node* temp = head;
            for (int i = 0; i < index-1; i++) 
            {
                temp = temp->next;
            }
            newNode->next = temp->next;
            temp->next = newNode;
        }
        size++;
    }

    void erase(int index) {
        if (index < 0 || index >= size) 
        {
            cerr << "잘못입력하였습니다." << endl;
            Sleep(1000);
            return;
        }
        if (index == 0) 
        {
            Node* temp = head;
            head = head->next;
            delete temp;
        }
        else 
        {
            Node* temp = head;
            for (int i = 0; i < index-1; i++) 
            {
                temp = temp->next;
            }
            Node* target = temp->next;
            temp->next = target->next;
            delete target;
        }
        size--;
    }
};

int main()
{
    LinkedList list;

    while (true) 
    {
        system("cls");
        cout << "[1]. 앞에서 추가\t [2]. 앞에서 제거" << std::endl;
        cout << "[3]. 뒤에서 추가\t [4]. 뒤에서 제거" << std::endl;
        cout << "[5]. 원하는곳 넣기\t [6]. 원하는곳 제거" << std::endl;
        cout << "[7]. 프로그램 종료" << std::endl;
        cout << endl;

        cout << "리스트 : ";
        list.print();
        cout << endl;

        int choice;
        cout << "원하시는 메뉴를 선택하세요 : ";
        cin >> choice;

        switch (choice) 
        {
            case 1:
                list.pushFront();
                break;
            case 2:
                list.popFront();
                break;
            case 3:
                list.pushBack();
                break;
            case 4:
                list.popBack();
                break;
            case 5: 
                {
                    int index;
                    cout << "추가할 위치를 입력하세요: ";
                    cin >> index;
                    list.insert(index);
                    break;
                }
            case 6: 
                {
                    int index;
                    cout << "제거할 위치를 입력하세요: ";
                    cin >> index;
                    list.erase(index);
                    break;
                }
            case 7:
                exit(0);
                break;
            default:
                cerr << "잘못선택하셨습니다." << endl;
                Sleep(1000);
                break;
        }
    }
    return 0;
}

댓글