자료구조 1주차 과제부터 다시 정리하려고~~ 시작!
1주차는 내가 싫어하는 포인터가 많은 ~ 링크드리스트 그중에서도 single, , 양방향이 더 빡쳤던 기억!
아직도 포인터 어쩌구 잘 이해 못함 ㅋㅋ
1. 이것만 알면 풀수있긴 함. .
node->value 현재의 노드가 저장한 값
node->next 다음 노드를 가리키는 주소
node->head 대가리 주소
아직도 포인터 -> 쓰는거 헷갈림.. 컴공자격 박탈!
자구 첫번째 과제였는데
싱글링크드리스트 삭제 대가리에삽입 지우기 대가리출력 전체출력 하기!
보너스 점수가 tail에 삽입이었는데,, 그땐 못했는데 ,, 이번엔 했다 ㅎㅎ ^_^,,,, //
#include<iostream>
using namespace std;
//day 1 single linkedlist
// 마지막->next = null 임 마지막임을 표시
//node, list 클라스는 내가 원래 썼던거 그대루 가져옴
//하나의 노드
class Node {
friend class List;
private:
int value;
string name;
Node* next;
Node(int v, string na, Node* n) {
value = v;
name = na;
next = n;
}
Node() {
value = 0;
next = nullptr;
}
};
//리스트
class List {
private:
Node* head;
Node* tail;
int size;
public:
List(int, string);
void insertHead(int, string);
void insertTail(int, string);
void removeHead();
void isEmpty();
void printHead(int, string);
void printAll();
};
List::List(int value, string name)
{
head = tail = new Node(value, name, nullptr); // 하나의 싱글노드 가르키는게 ㄴㄴ
}
void List::insertHead(int value, string name) {
Node* newNode = new Node(value, name, nullptr);
if (head == nullptr)
{
tail = newNode;
//head가 비었으면 하나의 싱글노드 시작 List 그냥 풀어놓은,,
}
else {
//새로운 노드의 next가 기존의 head를 가르키게 해서
newNode->next = head;
}
head = newNode; //어쨌거나 새로운 노드가 head가 됨
}
void List::insertTail(int value, string name) {
Node* newNode = new Node(value, name, nullptr);
Node* node = head;
if (node->next != NULL) {
if (node->next != NULL) {
while (node->next != tail) {
node = node->next;
}
}
newNode->next = tail;
node->next = newNode;
}
else { // 첫노드라면 그냥 head이자 tail로
newNode->next = head;
head = newNode;
}
}
void List::removeHead() {
// 비었을때 error
// empty가 아니면 next 했을때 존재
Node* node = head;
Node* temp;
//뭔가있다면
if (node->next != nullptr) {
// temp를 head로 만들어주고 head는 계속 next 노드 가르키게
temp = head;
head = head->next; // head는 계속 next 가르키게
delete temp; // head가 된 temp를 지워벌임
}
else {
cout << "Invalid Removal" << endl;
}
}
void List::isEmpty() {
Node* node = head;
if (node == nullptr) {
cout << "T" << endl;
}
else {
cout << "F" << endl;
}
}
void List::printHead(int value, string name) {
Node* node = head;
if (node!= NULL) {
cout << "(" << node->name << "," << node->value << ")" << endl;
}
else {
cout << "Empty List" << endl;
}
//node = node->next; // node는 계속 next 노드를 가르키게
}
void List::printAll()
{
Node* node = head;
//node의 끝까지
if (node->next != NULL) {
while (node != NULL) {
if (node->next != NULL) {
cout << "(" << node->name << "," << node->value << ")" << endl;
}
node = node->next;
}
}
else {
cout << "Empty List" << endl;
}
}
int main()
{
char ch = 0;
string name;
int score = 0;
List* list = new List(score, name); //동적할당
while (ch != 'X') // X가 아닌동안
{
cin >> ch;
switch (ch)
{
case 'I':
cin >> name >> score; // 입력장치 필요
list->insertHead(score, name);
break;
case 'A':
cin >> name >> score;
list->insertTail(score, name);
break;
case 'R':
list->removeHead();
break;
case 'E':
list->isEmpty();
break;
case 'H':
list->printHead(score, name);
// Implement Head
break;
case 'T':
list->printAll();
break;
case'X':
return 0; // X를 입력할 경우 프로그램 종료
default:
cout << "Wrong Input" << endl;
break;
}
}
return 0;
}
'알고리즘까먹지말게' 카테고리의 다른 글
드디어 BFS/DFS 해보겠습니다. (0) | 2020.08.06 |
---|---|
자료구조 이것저것 정리 (0) | 2020.07.28 |
자구 4번째 과제(infix to postfix) (0) | 2020.07.28 |
STL Stack 이것저것 사용 (0) | 2020.06.09 |
STL 간단 정리 (0) | 2020.06.02 |