티스토리 뷰

더미 노드의 유무에 따른 코드의 변화를 직접 경험하는 것은 코드의 이해력을 높이는데 도움이 됩니다. 그래서 앞서 다루었던 예제

#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을(를) 삭제합니다.

*/
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함