나무 숲
연결 리스트 (Linked List) - 메모리의 동적 할당 본문
연결 리스트란? (메모리의 동적 할당)
메모리의 동적 할당, 즉 malloc와 free를 이용한 연결 리스트의 핵심 중 하나는 바로 아래 코드입니다
Node 구조체입니다.
여기서 Node란, data, 즉 어떤 값을 가지고 있으며, 동시에 Node형 구조체 변수의 주소 값을 저장할 수 있는 포인터 변수를 포함합니다. (책에서는 바구니에 비유)
더 단순하게 이해해보자면 Node의 값은 data, 그리고 다음 Node의 주소는 next에 있다. 즉 data라는 값을 가진 노드 하나는 next 노드를 가리킨다. 라고 생각할 수 있습니다. 아래 그림을 보시면 단번에 이해가 가능하실 거에요
이러한 next 노드의 연속으로 노드 구조체 변수들을 연결하는 것이 가능하며 연결 리스트가 생성됩니다.
위 코드는 연결 리스트를 관리하는데 있어 필요한 (연결 리스트)구조체입니다.
노드 구조체들을 변수로 가지며 각각
head는 연결 리스트의 시작 노드를,
tail은 연결 리스트의 끝 노드를,
current는 현재 노드를 가리킵니다.
연결 리스트 초기화
연결 리스트가 가리키는 값 head, tail, current를 각각 초기화합니다. (리스트를 처음 생성했을 땐 아무 노드도 없는 상태이므로 모든 변수들이 NULL을 가리킵니다. + 데이터의 갯수가 0)
데이터 출력
연결 리스트를 순서대로 출력합니다.
헤드를 current로 지정하여 헤드부터 tail까지 출력하며, current노드가 없으면, 즉 tail까지 출력이 완료되면 반복문을 빠져나옵니다.
데이터 삽입
데이터 삽입이란 어떤 노드에 데이터를 넣고 이 노드를 연결 리스트 속에 집어넣는 것을 의미합니다.
그림처럼 굉장히 간단합니다. 코드를 살펴보기 전 이 그림만 봐도 직관적으로 이해가 가능하실 거에요
그럼 세부적으로 설명해보도록 하겠습니다
새로운 리스트를 처음 생성했을 때, 위에서 나온 것처럼 모든 구조체 변수들은 NULL포인터입니다.
여기에 노드 하나를 삽입한다면..?
노드가 하나뿐이므로 머리=꼬리=뉴노드입니다. 뉴노드->next 노드가 없으므로 NULL을 가리킵니다. (위 그림에서는 화살표 없음=NULL)
이 상태에서 새로운 노드를 추가해보겠습니다
head는 첫 노드 그대로지만 tail은 뉴노드를 가리킵니다.
위 그림대로라면 뉴노드->next는 NULL, tail->next도 NULL이 되겠군요
노드를 계속 추가한 모습입니다.
이 그림 그대로 코드를 구현해보겠습니다.
1 새 노드를 연결 리스트의 머리에 추가할 경우
2 새 노드를 연결 리스트의 꼬리에 추가할 경우
3 새 노드를 특정 번째 노드로 추가할 경우
제가 구현한 것은 몇 번째 노드(where)로 추가할 것인가, 를 중점으로 하였습니다.
추가하고자 하는 위치가 리스트 내 데이터의 갯수를 넘어갈 때(예를 들어 리스트 길이는 2인데 4번째에 넣고자 할 때)에는 에러 메세지를 띄웁니다.
0 이하의 음수를 입력할 때의 예외처리는 따로 해주지 않았네요..
데이터 삭제
마찬가지로 어떤 데이터를 가진 노드를 삭제하는 것을 의미합니다.
여기서는 데이터 삽입과 다르게 더미노드를 이용했습니다.
1 연결 리스트의 머리에서 노드 삭제
2 연결 리스트의 꼬리에서 노드 삭제
(꼬리에서의 노드 삭제는 제가 그냥 한번 해본 거라.. 실제적인 효율은 별로 좋지 못할 것 같습니다.)
3 특정 번째 노드 삭제
데이터 삽입과 마찬가지로 몇 번째 노드(where)를 삭제할 것인가, 를 중점으로 하였습니다.
삭제하고자 하는 위치가 리스트 내 데이터의 갯수를 넘어갈 때(예를 들어 리스트 길이는 2인데 4번째 노드를 삭제하고자 할 때)에는 에러 메세지를 띄웁니다.
여기도 마찬가지로 무조건 자연수만 입력한다는 가정 하에 만든 코드입ㄴㅣ다ㅠ
그리고 데이터 삽입과는 다르게.. where이 1 이거나 리스트 내 데이터의 갯수와 같을 경우엔 각각 DeleteHead, DeleteTail 함수를 호출하였습니다.
--------------------------------------------------------------------------------------------------------------------------------------------------------------
응용하면 입력받은 값으로 리스트를 만드는 것도 가능합니다.
많이 부족하기에 참고용으로 봐주시면 + 틀린 부분이 있다면 고쳐주시면 감사드리겠습니다
읽어주셔서 감사합니다.
'Career > 알고리즘 · 자료구조' 카테고리의 다른 글
연결 리스트 (Linked List) - 이중 연결 리스트, 이중 원형 연결 리스트 (2) | 2016.08.16 |
---|---|
연결 리스트 (Linked List) - 원형 연결 리스트 (0) | 2016.08.15 |
연결 리스트 (Linked List) - 배열 (0) | 2016.07.15 |
하노이 타워 (The Tower of Hanoi) (0) | 2016.07.09 |
이진 탐색 (Binary Search) (0) | 2016.07.05 |