728x90
연결 리스트
- 배열 기반 리스트의 단점인 길이(크기)가 고정되어 있다는 점을 커버할 수 있음
- 그리고 배열 기반 리스트의 장점인 순차 접근도 가능
- 필요할 때마다 할당해서 사용하고 할당한 것을 순차적으로 연결
- 가장 처음 부분의 주소값만을 가지고 순차적으로 접근 가능한 것이 연결 리스트
- 연결 리스트를 구성할 때 필요한 부분 : 어떻게 연결할 것인가? 어떻게 순차적으로 접근할 것인가?
노드
typedef struct _node
{
int data; // 실제 노드가 가지고 있는 데이터
struct _node* next; // 다음 노드를 가르키는 포인터(연결을 담당)
} Node;
연결 리스트 분석
- 초기화
-> head : 첫번째 노드(무조건 필요)
-> tail : 가장 마지막 노드(생략 가능)
-> cur : 순차접근을 위한 노드
Node * head = NULL; // NULL 포인터 초기화
Node * tail = NULL;
Node * cur = NULL;
Node * newNode = NULL;
- 삽입 : 노드를 꼬리에 추가
-> next 부분의 역슬래시 표시는 NULL을 의미
while(1)
{
printf("자연수 입력: ");
scanf("%d", &readData);
if(readData < 1) break;
newNode = (Node*)malloc(sizeof(Node)); // 동적 할당
newNode->data = readData; // 노드의 데이터부분에 저장
newNode->next = NULL; // 다음을 가르키는 노드를 우선 NULL로 초기화
///////////////////// 1단계 ////////////////////////////////
if(head == NULL) head = newNode;
else tail->next = newNode;
///////////////////// 2단계 ////////////////////////////////
tail = newNode;
///////////////////// 3단계 ////////////////////////////////
}
- 조회 : 순차적으로 접근
if(head == NULL)
{
printf("저장된 자연수가 존재하지 않습니다. \n");
}
else
{
cur = head;
printf("%d ", cur->data); // 첫 번째 데이터 출력
while(cur->next != NULL) // 두 번째 이후의 데이터 출력
{
cur = cur->next; // 이동하고
printf("%d ", cur->data); // 조회하고
}
}
- 삭제 : 노드 2개를 사용하여 삭제 과정을 진행
if(head == NULL)
{
return 0; // 해제할 노드가 존재하지 않는다.
}
else
{
Node * delNode = head;
Node * delNextNode = head->next;
printf("%d을(를) 삭제합니다. \n", head->data);
free(delNode); // 첫 번째 노드의 삭제
while(delNextNode != NULL) // 두 번째 이후의 노드 삭제 위한 반복문
{
delNode = delNextNode;
delNextNode = delNextNode->next;
printf("%d을(를) 삭제합니다. \n", delNode->data);
free(delNode); // 두 번째 이후의 노드 삭제
}
}
728x90
'Programming > Data Structure' 카테고리의 다른 글
열혈 자료구조 - 4-2. 단순 연결 리스트의 ADT와 구현(2) (0) | 2020.12.06 |
---|---|
열혈 자료구조 - 4-2. 단순 연결 리스트의 ADT와 구현(1) (0) | 2020.12.06 |
열혈 자료구조 - 3-2. 배열을 이용한 리스트의 구현(2) (1) | 2020.12.05 |
열혈 자료구조 - 3-2. 배열을 이용한 리스트의 구현(1) (0) | 2020.12.05 |
열혈 자료구조 - 3-1. 추상 자료형 (0) | 2020.12.03 |