이번과제로 연결리스트를 구현하는 과제가있었다.
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;
}
'공부' 카테고리의 다른 글
[C++] 스네이크 게임 (0) | 2023.04.28 |
---|---|
[자료구조] 트리, 해시 테이블, 이진 탐색 참조블로그 (0) | 2023.04.25 |
[C++]함수포인터 참고 블로그 (0) | 2023.04.22 |
[C++ / 자료구조]연결 리스트(Linked List) (0) | 2023.04.20 |
[CS]바이트 패딩(Byte Padding) (0) | 2023.04.20 |
댓글