[Data Structures | C++] Linked List & Array : 링크드리스트 & 배열

배열(Array) #

데이터를 물리적 주소에 순차적으로 저장하며 인덱스를 가지고 있어 바로 접근할 수 있기 때문에 접근 속도가 매우 빠르다.\ 그러나, 배열은 크가가 고정되어 있기 때문에 처음 지정된 사이즈보다 더 많은 데이터를 넣으려면 배열의 크기를 늘리는 연산을 해야하고 데이터 삽입/삭제시 해당 위치 다음칸에 있는 데이터를 모두 한칸씩 뒤로 밀거나 앞으로 당겨오는 연산을 해야하기 때문에 데이터 삽입/삭제에는 약한 모습을 보인다.

연결리스트(LinkedList) #

데이터를 저장할 때 데이터만 저장하는 것이 아니라 다음 데이터의 물리적 주소까지 같이 저장한다.\ (단순 연결리스트는 다음 데이터의 주소를, 이중 연결리스트는 이전 주소와 다음 주소를 모두 저장) 특정 데이터에 접근할 때 인덱스로 바로 접근할 수 있었던 배열과 달리 첫 노드부터 원하는 노드까지 링크를 따라가야 접근이 가능하기 때문에 배열에 비해 접근 속도는 떨어진다.\ 하지만 반대로, 데이터를 삽입/삭제 할 때에는 물리적 주소에 구애받지 않고 앞/뒤 노드의 주소만 끼워넣을 노드의 주소로 바꿔주면 되기 때문에 삽입/삭제는 배열보다 빠르다.

C++로 구현한 양방향 연결 리스트(Double Linked List) #

  1/**
  2 * 연결리스트(LinkedList)에 사용할 노드 클래스
  3 */
  4class Node
  5{
  6private:
  7	Node *Llink;
  8	Node *Rlink;
  9
 10	int IDNode;
 11	int Data;
 12public:
 13	Node();
 14	~Node();
 15
 16
 17	Node *getLlink() { return Llink; }
 18	Node *getRlink() { return Rlink; }
 19
 20	void setLlink(Node *llink) { Llink = llink; }
 21	void setRlink(Node *rlink) { Rlink = rlink; }
 22
 23	int getData() { return Data; }
 24	void setData(int _Data) { Data = _Data; }
 25
 26	int GetID() { return IDNode; }
 27	void SetID(int idnum) { IDNode = idnum; }
 28};
 29
 30/**
 31 * Double Linked List 클래스
 32 */
 33class DoubleList
 34{
 35private:
 36	Node *Head;
 37	Node *Tail;
 38	int IDCount;
 39public:
 40	DoubleList();
 41	~DoubleList();
 42
 43	Node *getHead() { return Head; }
 44	Node *getTail() { return Tail; }
 45
 46	Node *ArrangeNode(int pos);
 47
 48	void insertNode(int _data, int _location); //삽입 추가 (위치 입력 가능)
 49	void delNode(int _location); //삭제 (위치 입력 가능)
 50	void displayNode(); //출력
 51	void AllDel(); //모두 삭제
 52	int CountNode(); //현재 노드 갯수
 53	int Find(int _location); //위치를 찾아 노드 데이터 찾기
 54	void Reverse(); //뒤집기
 55};
 56
 57/**
 58 * Double Linked List 메뉴
 59 */
 60void Manager::Doublerun() {
 61	int _menu = 0;
 62	int find = 0;
 63	int Num = 0;
 64	int _position = 0;
 65
 66	while (true) {
 67		cout << "1.추가 2.삭제 3.출력 4.전체삭제 5.노드 총 갯수\n6.찾기 7.링크드 뒤집기\n입력 : ";
 68		cin >> _menu;
 69
 70		switch (_menu)
 71		{
 72		case INSERT:
 73			cout << "추가할 정수 : ";
 74			cin >> Num;
 75			cout << "위치 입력 : ";
 76			cin >> _position;
 77			doublelist->insertNode(Num, _position);
 78			break;
 79		case DEL:
 80			if (doublelist->getHead() == NULL) {
 81				cout << "데이터가 없습니다." << endl << endl;
 82			}
 83			else {
 84				int _location = 0;
 85				cout << "데이터 삭제할 위치 : ";
 86				cin >> _location;
 87				doublelist->delNode(_location);
 88			}
 89			break;
 90		case COUT:
 91			if (doublelist->getHead() == NULL) {
 92				cout << "데이터가 없습니다." << endl << endl;
 93			}
 94			else {
 95				doublelist->displayNode();
 96			}
 97			break;
 98		case ALLDEL:
 99			if (doublelist->getHead() == NULL) {
100				cout << "데이터가 없습니다." << endl << endl;
101			}
102			else {
103				doublelist->AllDel();
104			}
105			break;
106		case COUNTNODE:
107			cout << "총 갯수 : " << doublelist->CountNode() << endl;
108			break;
109		case SEARCH:
110			if (doublelist->getHead() == NULL) {
111				cout << "데이터가 없습니다." << endl << endl;
112			}
113			else {
114				cout << "몇 번째 데이터 : ";
115				cin >> find;
116				cout << "당신이 찾는 데이터 : " << doublelist->Find(find) << endl << endl;
117			}
118			break;
119		case REVERSE:
120			cout << "뒤집기 전 출력 : " << endl;
121			doublelist->displayNode();
122			doublelist->Reverse();
123			cout << "뒤집기 후 출력 : " << endl;
124			doublelist->displayNode();
125			break;
126		default:
127			cout << "다시 입력해주세요" << endl;
128			break;
129		}
130	}
131}
132
133/**
134 * Node 추가
135 */
136void DoubleList::insertNode(int _data, int _position) {
137	++IDCount;
138	Node *newNode = new Node;
139	newNode->setData(_data);
140	newNode->SetID(IDCount);
141
142	if (Head == NULL) {
143		Head = newNode;
144		Tail = Head;
145	}
146	else {
147		if (_position == 0) {
148			newNode->setRlink(Head);
149			Head->setLlink(newNode);
150			Head = newNode;
151		}
152		else if (_position == -1) {
153			newNode->setLlink(Tail);
154			Tail->setRlink(newNode);
155			Tail = newNode;
156		}
157		else {
158			Node *before = Head;
159			while ((--_position) > 0)
160			{
161				before = before->getRlink();
162			}
163			if (before->getRlink() != NULL) {
164				before->getRlink()->setLlink(newNode);
165			}
166			newNode->setLlink(before);
167			newNode->setRlink(before->getRlink());
168			before->setRlink(newNode);
169		}
170	}
171}
172
173/**
174 * Node 삭제
175 */
176void DoubleList::delNode(int _location) {
177	if (_location == 0) {
178		Head = Head->getRlink();
179		if (Head != NULL) {
180			Head->setLlink(NULL);
181		}
182	}
183	else {
184		Node *before = Head;
185		while ((--_location) > 0)
186		{
187			before = before->getRlink();
188		}
189		Node *after = before->getRlink()->getRlink();
190		if (after != NULL) {
191			before->setRlink(after);
192			after->setLlink(before);
193		}
194		else {
195			before->setRlink(NULL);
196		}
197	}
198}
199
200/**
201 * Node 출력
202 */
203void DoubleList::displayNode() {
204	Node *Temp = Head;
205	while (true)
206	{
207		if (Temp == NULL) {
208			break;
209		}
210		else {
211			cout << "ID:" << Temp->GetID() << " Data:" << Temp->getData() << endl;
212			Temp = Temp->getRlink();
213		}
214	}
215}
216
217/**
218 * Node 모두 삭제
219 */
220void DoubleList::AllDel() {
221	while (true)
222	{
223		if (Head == NULL) {
224			break;
225		}
226		else {
227			delNode(0);
228		}
229	}
230}
231
232/**
233 * 현재 Node 갯수
234 */
235int DoubleList::CountNode() {
236	int count = 0;
237
238	Node *now = new Node;
239	for (now = Head; now; now = now->getRlink()) {
240		count++;
241	}
242	return count;
243}
244
245/**
246 * Node 찾기
247 */
248int DoubleList::Find(int _location) {
249	Node *current = Head;
250	while ((--_location) >= 1) {
251		current = current->getRlink();
252	}
253	return current->getData();
254}
255
256/**
257 * Node 뒤집기
258 */
259void DoubleList::Reverse()
260{
261	Node *current = Head;
262	while (current != NULL)
263	{
264		Node *next = current->getRlink();
265		current->setRlink(current->getLlink());
266		current->setLlink(next);
267		if (next == NULL) {
268			Tail = Head;
269			Head = current;
270			break;
271		}
272		current = next;
273	}
274}
Advertisement