티스토리 뷰

앞서 소개한 연결 리스트 예제

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

*/

에 익숙해지는 가장 빠르고도 흥미로운 길은 예제를 조금 수정해 보는 것입니다. 따라서 예제를 조금 수정해 볼 기회를 제공하고자 합니다. 예제 수정을 위한 주제는 다음과 같습니다.

  • 새 노드를 연결 리스트의 꼬리가 아닌 머리에 추가한다.

예제에서는 노드를 머리가 아닌 꼬리에 추가했습니다. 따라서 3 → 2 → 7→ 8 순으로 연결되어 있는 리스트에 5를 추가로 삽입하면 3 → 2 → 7→ 8 → 5 의 순으로 저장이 됩니다. 그런데 이번에는 5 → 8 → 7 → 2 → 3 의 순으로 저장이 되도록 예제를 변경해 보고자 합니다. 즉, 연결 리스트의 머리에 노드가 추가되도록 에제를 변경하는 것입니다. 이 문제가 쉬워 보이더라도 그림을 그려서 머리에 노드가 추가되는 과정을 완전히 정리한 다음에 코드로 옮기기 바랍니다. 그리고 이를 습관화하길 바랍니다.


제가 작성한 코드는 아래의 '더보기'를 클릭하여 확인할 수 있습니다.

더보기
#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
	int data;
	struct Node* front;    //노드의 앞을 가리키는 front 추가
	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));
		if (newNode == NULL)
		{
			printf("메모리 공간이 부족합니다.");
			exit(1);
		}
		newNode->data = readData;
		newNode->front = NULL;
		newNode->next = NULL;

		//새로 추가되는 노드가 가장 앞으로 배치되도록 수정
		if (tail == NULL) tail = newNode;
		else
		{
			newNode->next = head;
			head->front = newNode;
		}

		head = 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

입력 받은 데이터의 전체 출력!
4321

4을(를) 삭제합니다.
3을(를) 삭제합니다.
2을(를) 삭제합니다.
1을(를) 삭제합니다.

*/

데이터를 추가로 입력하여 새로운 노드가 생성되면 기존 노드들의 가장 앞으로 배치되도록 했습니다. 그리고 출력은 head부터 tail 순서로 출력하게끔 하여 가장 최근에 입력된 노드가 먼저 출력되고, 가장 처음 입력된 노드가 가장 마지막에 출력되도록 했습니다.

혹시 이해가 어렵거나 설명이 부족했다면 언제든지 댓글로 물어봐주세요.

공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함