일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 연결리스트
- BOJ
- JUCE library
- C++ library
- 공룡책
- go channel
- 자료구조
- Nebula
- C++
- Docker
- 리듬게임
- vim-go
- go
- tour of go
- JUCE라이브러리
- 코딩
- C++ gui
- JUCE 튜토리얼
- 백준
- 프로그래밍
- LOB
- OS
- 운영체제
- C언어
- JUCE
- C++ gui 라이브러리
- c++ heap
- 알고리즘
- gui
- a tour of go
Archives
- Today
- Total
CafeM0ca
[자료구조]단일 연결 리스트(C++ 재귀) 본문
반응형
간단한 자료구조라서 짜는데 별로 오래 안걸릴 줄 알았지만 최소 12시간 붙잡고 구현했다.
모든 자료형에 대해 처리 해주고 싶었는데 C++은 정적언어라 불가능했다. 템플릿을 쓰던, auto를 쓰던 입력값에 대해 자료형을 알아내는 문법은 없더라..(이것땜에 하루 새벽 보내버렸고)
일단 포기하고 int형만 받도록 했다. 아마 모든 자료형에 대해 처리하려면 오버로딩이나 자료형 테이블을 만들어서 테이블을 통해 연결리스트의 노드들을 이어줘야 할 듯 하다. (파이썬 쓰는게 답이다)
컴파일 환경: g++ -std=c++11
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | #include<iostream> #include<string> using namespace std; template<typename T> class Type{ private: T data; public: Type(){} ~Type(){} }; class Node{ private: Node *next; //다음 노드 int d; //데이터 int v; //데이터 존재 여부 d에 NULL이 안들어가서 0으로 초기화하면 확인 과정에서 문제가 생김 public: Node() :d(0),v(0){ next=nullptr; } void Linking(Node& n){ //n은 this 객체의 next노드 따라서 this객체를 next객체로 바꿔야함 this->d=n.d; this->v=n.v; if(n.v==1) this->next=n.next; n.next=nullptr; //두 번 해제 방지 delete &n; //다 정리해주고 메모리 해제 } Node& operator=(Node& n){ Linking(n); return *this; } void Insert(int &f){ if(v==1) next->Insert(f); else{ d=f; v=1; next=new Node; } } void Insert(int& f,int n){ if(n>0 && v==1){ //값이 있으면 새로 노드 만듬 n-=1; next->Insert(f,n); } else{ //값 없으면 대입 if(n==0 && v==1){ //중간에 껴 넣을 경우 Node *Ln=new Node; Ln->Linking(*this); next=new Node; Insert(f); next->Linking(*Ln); } else{ //맨 마지막 노드 next=new Node; next->Insert(f); Linking(*next); } } } void Find(int& f){ if(v==0) cout <<"찾는 데이터가 없습니다.\n"; else if(d==f) cout <<"찾았습니다. data: " << d << '\n'; else next->Find(f); } void Remove(int& f){ if(v==0) cout<<"지울 데이터가 없습니다.\n"; else if(d==f && this->next==nullptr) //맨 끝 노드 일 때 delete this; else if(d==f && this->next!=nullptr) Linking(*next); else next->Remove(f); } void Change(int& f1,int& f2){ if(v==0) cout<<"교체할 데이터가 없습니다.\n"; else if(d!=f1) next->Change(f1,f2); else{ cout <<"교체완료 " << d <<" -> " << f2 << '\n'; d=f2; } } void List(){ if(v==1){ cout <<"data: " << d <<'\n'; if(next!=nullptr) next->List(); } } ~Node(){ if(next!=nullptr){ delete next; } } }; const int Info() { cout << "\n\n\n***번호 입력***\n"; cout << "1.데이터 삽입 2.데이터 삭제 3.데이터 찾기 4.데이터 교체 5.데이터 목록-종료는 아무키\n"; return 1; } enum {ins=1,del,fin,cha,lis}; int main(void) { Node *n=new Node; int value,d,select; while(Info()){ cout<<"\n\n***메뉴선택 : "; cin >> select; switch(select){ cout <<"select : "<<select<<endl; case ins: cout <<"저장할 데이터: "; cin >> d; cout <<"위치(자동 삽입은 0이하 : "; cin >> value; if(value < 1) n->Insert(d); else n->Insert(d,value); cout << "***삽입됨***\n"; break; case del: cout <<"지울 데이터: "; cin >> d; n->Remove(d); break; case fin: cout <<"찾을 데이터: "; cin >> d; n->Find(d); break; case cha: cout <<"교체할 데이터: "; cin >> d; cout <<"교체 값: "; cin >> value; n->Change(d,value); break; case lis: cout <<"***데이터 목록***\n"; n->List(); cout <<"*****************\n"; break; default : cout << "종료\n"; delete n; return 0; } } } | cs |
메모리 하도 터져가지고 메모리 가지고 불꽃놀이 했는데 정말 끔찍하더라.. 큰 프로그램이면 어떻게 될지;; 모든 자료형에 대한 처리는 추후 추가 해야겠다.
반응형
'Programming > 자료구조|알고리즘' 카테고리의 다른 글
[알고리즘]선택정렬(C++) (0) | 2018.06.02 |
---|---|
[자료구조]단일연결리스트(C 반복문) (0) | 2018.05.16 |
[알고리즘]삽입 정렬(C++) (0) | 2018.03.20 |
[C]큐 구현 (0) | 2017.11.16 |
[C]스택 구현 (0) | 2017.11.16 |
Comments