본문 바로가기
DSA

연결 리스트 예제

by KWONE 2024. 7. 14.

책의 정보를 저장하는 코드를 연결 리스트를 활용하여 만들어 보자.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define S_SIZE 50

typedef struct NODE {
	char title[S_SIZE];
	int year;
	struct NODE* link;
} NODE;

int main(void)
{
	NODE *list = NULL;		//list가 헤드 포인터
	NODE *p, *prev=NULL, *next;	//p가 링크 포인터, prev는 직전의 노드를 가리키는 포인터
	char buffer[S_SIZE];
	int year;

	//연결 리스트에 정보 입력
	while (1) {
		printf("책의 제목을 입력하시오:(종료하려면 엔터) ");
		gets_s(buffer, S_SIZE - 1);
		if (buffer[0] == '\0') break;

		p = (NODE*)malloc(sizeof(NODE));
		strcpy(p->title, buffer);
		printf("책의 출판 연도를 입력하시오: ");
		gets_s(buffer, S_SIZE - 1);
		year = atoi(buffer);
		p->year = year;

		if (list == NULL)	//list가 헤드포인터인데 NULL이면 노드가 하나도 없던것이므로 첫번째 노드로 설정
			list = p;	//새로운 노드를 첫번째 노드로 만든다
		else			//헤드포인터인 list가 비어있지 않다면
			prev->link = p;	//새로운 노드를 이전 노드의 끝에 붙인다.
		p->link = NULL;		//새로운 노드의 링크 필드를 NULL로 설정
		prev = p;
	}
	printf("\n");

	//연결 리스트에 들어 있는 정보 출력
	p = list;
	while (p != NULL)
	{
		printf("[%s,%d]->", p->title, p->year);
		p = p->link;
	}
	printf("\n");

	//동적 할당 해제
	p = list;
	while (p != NULL) {
		next = p->link;
		free(p);
		p = next;
	}

	return 0;
}

 

 

노드 데이터 출력 순회

  1. p를 리스트의 첫 번째 노드로 설정합니다.
  2. p가 NULL이 아닐 때까지 반복합니다.
  3. 현재 노드의 데이터를 출력합니다.
  4. p를 다음 노드로 이동합니다.

메모리 해제 순회

  1. p를 리스트의 첫 번째 노드로 설정합니다.
  2. p가 NULL이 아닐 때까지 반복합니다.
  3. 다음 노드를 next에 저장합니다.
  4. 현재 노드의 메모리를 해제합니다.
  5. p를 다음 노드로 이동합니다.

'DSA' 카테고리의 다른 글

스택 (stack)  (0) 2024.07.22
기수 변환  (0) 2024.07.16
연결 리스트 (linked list)  (0) 2024.07.13
최대값,최소값,중앙값 찾기 알고리즘  (1) 2024.06.25
백준 10811번 배열 부분 역순 정렬  (0) 2024.06.23