응애맘마조

추가 및 삭제 본문

공부/3D과제

추가 및 삭제

TH.Wert 2023. 4. 25. 21:30

끝 부분에서 추가 및 삭제와 임의의 위치에서 추가 및 삭제하는 것이 과제였습니다.

#include <iostream>
#include <vector>
#include <list>

using namespace std;

//노드
template<typename T>
struct ListNode
{
    T data;
    ListNode* next = nullptr;
    ListNode(T data) :data(data) {}
    void Print()
    {
        cout << data << "->";
        //재귀
        if (next)
            next->Print();
    }
};

//기능을 제공하는 클래스
template<typename T>
class LinkedList
{
public:
    ListNode<T>* head = nullptr;
    //void Push_back()
    void PrintAll()
    {
        if (head)
            head->Print();
    }
    void pop_front()
    {
        if (head != nullptr)
        {
            ListNode<T>* temp = head->next;
            delete head;
            head = temp;
        }
    }
    void push_front(T& data)
    {
        //헤드가 아무것도 없을때
        if (head == nullptr)
            head = new ListNode<T>(data);
        else
        {
            ListNode<T>* temp = new ListNode<T>(data);
            temp->next = head;
            head = temp;
            //head = (new ListNode<T>(data))->next = head;
        }
    }
    void push_front(T&& data)
    {
        //헤드가 아무것도 없을때
        if (head == nullptr)
            head = new ListNode<T>(data);
        else
        {
            ListNode<T>* temp = new ListNode<T>(data);
            temp->next = head;
            head = temp;
        }
    }
    void pop_back()
    {
        ListNode<T>* temp = head;
        while (temp->next != nullptr)//반복문을 이용하여 노드의 끝까지 이동한다.
        {
            if (temp->next->next == nullptr)//조건문을 이용하여 노드의 마지막 전노드에서 멈춘다
            {
                break;//조건 만족시 탈출
            }
            temp = temp->next;//가르키는 노드를 이동시킨다.
        }//
        temp->next = nullptr;
    }
    void push_back(T& data)
    {
        //헤드가 아무것도 없을때
        if (head == nullptr)
            head = new ListNode<T>(data);
        else
        {
            ListNode<T>* temp = head;
            while (temp->next != nullptr)
            {
                temp = temp->next;
            }
            ListNode<T>* temp2 = new ListNode<T>(data);//삽입할 노드
            temp->next = temp2;
        }
    }
    void push_back(T&& data)
    {
        //헤드가 아무것도 없을때
        if (head == nullptr)
            head = new ListNode<T>(data);
        else
        {
            ListNode<T>* temp = head;
            while (temp->next != nullptr)
            {
                temp = temp->next;
            }
            ListNode<T>* temp2 = new ListNode<T>(data);
            temp->next = temp2;
        }
    }
    void insert(int idx, T& data)
    {
        if (idx == 0)
        {
            if (head == nullptr)
                head = new ListNode<T>(data);
            else
            {
                ListNode<T>* temp = new ListNode<T>(data);
                temp->next = head;
                head = temp;
            }
        }
        else
        {
            if (head == nullptr)
                head = new ListNode<T>(data);
            else
            {
                ListNode<T>* temp = head;
                for (int i = 0; i < (idx - 1); i++)
                {
                    temp = temp->next;
                }
                ListNode<T>* temp2 = new ListNode<T>(data);
                ListNode<T>* temp3 = temp->next;
                temp->next = temp2;
                temp2->next = temp3;

            }
        }
    }
    void erase(int idx)
    {
        if (idx == 0)
        {
            pop_front();
        }
        else
        {
            ListNode<T>* temp = head;
            for (int i = 0; i < (idx - 1); i++)
            {
                temp = temp->next;
            }
            ListNode<T>* temp2 = temp->next->next;
            delete temp->next;
            temp->next = temp2;
        }
    }
};


int main()
{
    LinkedList<int> LL;
    LL.push_front(3);
    LL.push_front(5);
    LL.push_front(10);

    while (1)
    {
        int input;
        cout << "리스트 : ";
        LL.PrintAll();
        cout << endl;

        cout << "1.앞에서 추가 2.앞에서 삭제";
        cout << "  3.뒤에서 추가 4.뒤에서 삭제";
        cout << "  5.중간 추가 6.중간 삭제" << endl;
        cin >> input;
        if (input == 1)
        {
            cout << "추가할 값을 입력해주세요 :";
            int temp;
            cin >> temp;
            LL.push_front(temp);
        }
        else if (input == 2)
        {
            LL.pop_front();
        }
        else if (input == 3)
        {
            cout << "추가할 값을 입력해주세요 :";
            int temp;
            cin >> temp;
            LL.push_back(temp);
        }
        else if (input == 4)
        {
            LL.pop_back();
        }
        else if (input == 5)
        {
            cout << "원하는 노드선택 :";
            int temp1, temp2;
            cin >> temp1;
            cout << "원하는 값 입력 :";
            cin >> temp2;
            LL.insert(temp1, temp2);
        }
        else if (input == 6)
        {
            cout << "원하는 노드선택 :";
            int temp;
            cin >> temp;
            LL.erase(temp);
        }
    }
    int a;
    cin >> a;

    return 0;
}

코드입니다.

 

읽어주셔서 감사합니다.

Comments