책의 정보를 저장하는 코드를 연결 리스트를 활용하여 만들어 보자.
#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;
}
노드 데이터 출력 순회
- p를 리스트의 첫 번째 노드로 설정합니다.
- p가 NULL이 아닐 때까지 반복합니다.
- 현재 노드의 데이터를 출력합니다.
- p를 다음 노드로 이동합니다.
메모리 해제 순회
- p를 리스트의 첫 번째 노드로 설정합니다.
- p가 NULL이 아닐 때까지 반복합니다.
- 다음 노드를 next에 저장합니다.
- 현재 노드의 메모리를 해제합니다.
- 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 |