Taking baby-developer steps
2-2. 연결리스트 - 메모리 해제 함수 / 전체 출력 함수 / 구현 시 주의할 점 / 연결 리스트의 특징 본문
CS 지식/C언어_자료구조
2-2. 연결리스트 - 메모리 해제 함수 / 전체 출력 함수 / 구현 시 주의할 점 / 연결 리스트의 특징
Surin Lee 2021. 4. 6. 09:12저번 연결리스트 포스팅의 예제들에서, 모든 노드값을 출력하는 부분이 상당히 긴것을 볼 수 있는데, 이것을 다음과 같이 모든 노드값을 출력하는 함수 showAll()을 만들어 출력하도록 하면 훨씬 효율적이다.
void showAll(Node *root){
Node *curr = head->next;
while (curr != NULL){
printf("%d ", curr->data);
curr = curr->next;
}
printf("\n");
}
연결 리스트의 전체 원소 메모리를 할당 해제하는 함수는 다음과 같다.
void freeAll(Node *root){
Node *cur = head->next;
while(cur != NULL){
Node *next = cur->next;
free(cur);
cur = next;
}
}
전체원소를 할당 해제할 때, 'head'는 할당 해제하지 않는다.
위에서 정의한 함수를 이용해 단일 연결 리스트를 만들어 보면 다음과 같다.
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int data;
struct Node *next;
} Node;
Node *head;
void addNode (Node *root, int data){
Node (*newnode) = (int*)malloc(sizeof(Node));
newnode->data = data;
newnode->next = root->next;
root->next = newnode;
}
void removeFront(Node *root){
Node *front = root->next;
root->next = front->next;
free(front);
}
void freeAll(Node *root){
Node *cur = head->next;
while(cur != NULL){
Node *next = cur->next;
free(cur);
cur = next;
}
}
void showAll(Node *root){
Node *cur = head->next;
while (cur != NULL){
printf("%d ", cur->data);
cur = cur->next;
}
printf("\n");
}
int main(void){
head = (Node*)malloc(sizeof(Node));
head->next = NULL;
addNode(head,5);
addNode(head,4);
addNode(head,3);
addNode(head,2);
addNode(head,1);
showAll(head);
freeAll(head);
system("pause");
return 0;
}
1 2 3 4 5
+ 위의 코드에서, main함수에서 freeAll을 호출한 다음, showAll을 호출하면, 5개의 쓰레기 값을 볼 수 있다.
연결 리스트를 구현 할 때 주의할 점
위 소스코드에 덧붙여서, 삽입 및 삭제 기능에서 예외 사항을 처리할 필요가 있다. 삭제할 원소가 없는데 삭제하는 경우, 머리(Head)노드 자체를 잘못 넣은 경우 등을 체크해서 예외 처리 해야한다.
연결 리스트의 특징
- 삽입과 삭제가 배열에 비해서 간단하다는 장점이 있다.
- 배열과 다르게, 특정 인덱스로 즉시 접근하지 못하며, 원소를 차례대로 검색해야 한다. 이런 점에서 상대적으로 배열에 비해 처리 속도가 느릴 수 있다.(물론, 삽입과 삭제는 연결리스트의 처리 속도가 훨씬 빠르다.)
- 추가적인 포인터 변수가 사용되므로 메모리 공간이 낭비 된다.
요약
- 연결리스트는 데이터를 선형적으로 저장하고 처리하는 한 방법이다.
- 기존에 배열을 이용했을 때보다 삽입과 삭제가 많은 경우에 효율적이다.
- 다만 특정한 인덱스에 바로 참조해야 할 때가 많다면 배열을 이용하는 것이 효율적이다.
'CS 지식 > C언어_자료구조' 카테고리의 다른 글
Comments