C++ Double Linked Lists 구현 (2)

pyungjong·2024년 2월 19일

C++ 자료구조

목록 보기
2/4

Linked List

  • Linked List는 data를 저장하는 node를 가지고 있다.
  • Linked List는 data와 다음 node에 대한 포인터를 가지고 있다.
  • Double Linked List는 data와 다음 node, 이전 node에 대한 포인터를 가지고 있다.

2) Operations on a linked list

1. Linked List 길이

template <class Item>
size_t length(const node<Item>* head_ptr) {
	size_t count = 0;
	const node<Item>* cursor;
	for (cursor = head_ptr; cursor != NULL; cursor = cursor->after_link()) {
		count++;
	}
	return count;
}
  • head_ptr과 동일한 포인터 cursor 선언
  • 처음 노드부터 순차적으로 탐색
  • 다음 노드로 이동 cursor = cursor->after_link()

2. Linked List 삽입

2-1. Linked List 맨 처음 삽입

template <class Item>
void head_insert(node<Item>*& head_ptr, const Item& entry) {
	head_ptr = new node<Item>(entry, NULL, head_ptr);
}
  • Linked List의 head 포인터를 이중 포인터로 가져온다. (head_ptr이 바뀌기 때문)
  • 다음 노드가 headptr이고 삽입할 데이터를 가지는 새로운 노드를 생성: _new node
  • head_ptr 변경

2-2. Linked List 중간 삽입

template <class Item>
void list_insert(node<Item>* pre_ptr, const Item& entry) {
	node<Item>* insert_node = new node<Item>(entry, pre_ptr, pre_ptr->after_link());
	
    pre_ptr->set_after_link(insert_node);
	
	if (insert_node->after_link() != NULL) {
		insert_node->after_link()->set_pre_link(insert_node);
	}
}
  • 삽입할 노드의 이전 위치를 가져온다.
  • 삽입할 노드의 이전과 다음 노드를 설정하고, 데이터 값을 가지는 새로운 노드 생성
  • 이전 노드의 다음 노드를 삽입할 노드로 변경
  • 삽입한 노드의 다음 노드가 존재한다면, 다음 노드의 이전 노드 변경

3. Linked List 삭제

3-1. Linked List 맨 처음 삭제

template <class Item>
void head_remove(node<Item>*& head_ptr) {
	node<Item>* remove_ptr = head_ptr;

	head_ptr = head_ptr->after_link();
	head_ptr->set_pre_link(NULL);

	delete remove_ptr;
}
  • Linked list의 head 포인터 변경
  • Node 삭제

3-2. Linked List 중간 삭제

template <class Item>
void list_remove(node<Item>* pre_ptr) {
	node<Item>* remove_ptr = pre_ptr->after_link();

	pre_ptr->set_after_link(remove_ptr->after_link());
	if (remove_ptr->after_link() != NULL) {
		remove_ptr->after_link()->set_pre_link(pre_ptr);
	}

	delete remove_ptr;
}
  • 삭제할 노드의 이전 노드의 다음 노드 변경
  • 삭제할 노드의 다음 노드가 존재한다면, 다음 노드의 이전 노드 변경
  • Node 삭제

4. Linked List 검색

template <class Item>
node<Item>* search(node<Item>* head_ptr, const Item& target) {
	node<Item>* cursor;
	for (cursor = head_ptr; cursor != NULL; cursor = cursor->after_link()) {
		if (cursor->data() == target) {
			return cursor;
		}
	}
	return NULL;
}
  • Linked List의 처음부터 검색
  • 동일한 데이터를 가지고 있는 노드를 찾으면 노드의 포인터 반환
  • 데이터가 존재하지 않으면 NULL 반환

5. Linked List 위치

template <class Item>
node<Item>* location(node<Item>* head_ptr, size_t position) {
	node<Item>* cursor = head_ptr;

	for (int i = 0; i < position; i++) {
		cursor = cursor->after_link();
		if (cursor == NULL) {
			return NULL;
		}
	}
	return cursor;
}
  • Linked List 위치의 노드 포인터 반환
  • NULL 에러 발생
profile
코린이

0개의 댓글