응애맘마조
추가 및 삭제 본문
끝 부분에서 추가 및 삭제와 임의의 위치에서 추가 및 삭제하는 것이 과제였습니다.
#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;
}
코드입니다.
읽어주셔서 감사합니다.
'공부 > 3D과제' 카테고리의 다른 글
전위, 중위, 후위 노드 추가 탐색 및 삭제 (0) | 2023.05.01 |
---|---|
이진탐색트리, DFS, BFS, (전위, 중위, 후위) 순회 (0) | 2023.04.27 |
진짜 사람 찾기 (0) | 2023.04.27 |
하노이의 탑 (0) | 2023.04.26 |
마이크로프로세서, CPU, 메모리, 레지스터, 캐시 (0) | 2023.04.19 |
Comments