티스토리 뷰
더미 노드의 유무에 따른 코드의 변화를 직접 경험하는 것은 코드의 이해력을 높이는데 도움이 됩니다. 그래서 앞서 다루었던 예제
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node* next;
} Node;
int main(void)
{
Node* head = NULL;
Node* tail = NULL;
Node* cur = NULL;
Node* newNode = NULL;
int readData;
//데이터를 입력 받는 과정
while (1)
{
printf("자연수 입력 : ");
scanf("%d", &readData);
if (readData < 1) break;
//노드의 추가 과정
newNode = (Node*)malloc(sizeof(Node));
newNode->data = readData;
newNode->next = NULL;
if (head == NULL) head = newNode;
else tail->next = newNode;
tail = newNode;
}
printf("\n");
//입력 받은 데이터의 출력과정
printf("입력 받은 데이터의 전체 출력!\n");
if (head == NULL) printf("저장된 자연수가 존재하지 않습니다.\n");
else
{
cur = head;
printf("%d", cur->data);
while (cur->next != NULL)
{
cur = cur->next;
printf("%d", cur->data);
}
}
printf("\n\n");
//메모리의 해제 과정
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);
}
}
return 0;
}
/*
실행결과
자연수 입력 : 1
자연수 입력 : 2
자연수 입력 : 3
자연수 입력 : 4
자연수 입력 : 0
입력 받은 데이터의 전체 출력!
1234
1을(를) 삭제합니다.
2을(를) 삭제합니다.
3을(를) 삭제합니다.
4을(를) 삭제합니다.
*/
에서 생성하는 연결 리스트에 더미 노드를 추가하고, 그에 따른 코드의 변화를 직접 확인하기로 합니다. 이 예제는 리스트의 끝에다가 노드를 추가하는 방식이므로 head와 tail이 모두 필요합니다.
제가 작성한 코드는 아래의 '더보기'를 클릭하여 확인할 수 있습니다.
혹여 이해가 가지 않거나 추가 설명이 필요하다면 언제든지 댓글로 물어봐주시기 바랍니다.
더보기
//main.c 소스 파일로 저장
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node* next;
} Node;
int main(void)
{
Node* head = NULL;
Node* tail = NULL;
Node* cur = NULL;
Node dummy = { 0, NULL };
head = &dummy;
tail = &dummy;
Node* newNode = NULL;
int readData;
//데이터를 입력 받는 과정
while (1)
{
printf("자연수 입력 : ");
scanf("%d", &readData);
if (readData < 1) break;
//노드의 추가 과정
newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL)
{
printf("메모리 공간이 부족합니다.\n");
exit(1);
}
newNode->data = readData;
newNode->next = NULL;
tail->next = newNode;
tail = newNode;
}
printf("\n");
//입력 받은 데이터의 출력과정
printf("입력 받은 데이터의 전체 출력!\n");
if (head->next == NULL) printf("저장된 자연수가 존재하지 않습니다.\n");
else
{
cur = head->next;
while (cur != NULL)
{
printf("%d", cur->data);
cur = cur->next;
}
}
printf("\n\n");
//메모리의 해제 과정
if (head->next == NULL) return 0;
else
{
Node* delNode = head->next;
Node* delNextNode;
while (delNode != NULL)
{
delNextNode = delNode->next;
printf("%d을(를) 삭제합니다.\n", delNode->data);
free(delNode);
delNode = delNextNode;
}
}
return 0;
}
/*
실행결과
자연수 입력 : 1
자연수 입력 : 2
자연수 입력 : 3
자연수 입력 : 4
자연수 입력 : 0
입력 받은 데이터의 전체 출력!
1234
1을(를) 삭제합니다.
2을(를) 삭제합니다.
3을(를) 삭제합니다.
4을(를) 삭제합니다.
*/
'공부 일지 > 자료구조 공부 일지' 카테고리의 다른 글
연습문제 04. 3 연결 리스트에 구조체 변수의 주소 값 저장하기 (0) | 2021.03.10 |
---|---|
Chapter 04. 단순 연결 리스트의 ADT(추상 자료형)와 구현(2) (0) | 2021.03.10 |
Chapter 04. 단순 연결 리스트의 ADT(추상 자료형)와 구현(1) (0) | 2021.03.10 |
Chapter 04. 연결 리스트 관련 코드에 익숙해지기 연습문제 1 (0) | 2021.03.10 |
Chapter 04. 연결 리스트의 개념적인 이해 (0) | 2021.03.08 |