※ 인프런 강의 "C로 배우는 자료구조 및 여러가지 예제실습(권오흠 교수님)"를 보고 개인적인 복습을 위해 정리한 내용입니다.
add_song 함수를 구현하기 위해서는 다음과 같은 자료구조의 이해가 필요하다.
한 명의 가수를 구현하는 "구조체 Artist" 가 있다.
그 안에 이 가수의 노래 세 곡이 있다면 노래들을 양방향 리스트로 만들어준다.
이때 직접 Song 을 만드는 대신에 SNode 를 만든다. (= 각각의 SNode 가 Song을 거느린다.)
가수의 구조체 안 head와 tail 에 곡 첫번째와 마지막을 저장해준다. (양방향 리스트이므로)
가수 구조체는 artist_directory 배열의 이니셜에 따라 분류해서 단방향 연결리스트로 만들어준다.
next 는 가수끼리 단방향 연결리스트로 연결해주는 역할이다.
head와 tail은 SNode 를 양방향 연결리스트로 연결해주는 역할이다.
먼저 세 종류의 구조체를 정의하는 것부터 시작해보자.
구조체는 library.h 헤더파일에 정의하는 것이 좋다. 그래야 main.cpp 와 library.cpp 에서 둘 다 사용하는 것에서 문제 없다.
typedef struct song Song; /* 이렇게 먼저 정의하면 밑 구조체 순서 신경 쓸 필요가 없다 */
typedef struct snode SNode;
typedef struct artist Artist;
struct song
{
Artist *artist;
char *title;
char *path;
int index;
};
struct snode
{
struct snode *next, *prev;
Song *song;
};
struct artist
{
char *name;
struct artist *next;
SNode *head, tail;
};
library.cpp 에 artist_directory 배열을 만든다.
#include "library.h"
#define NUM_CHARS 256
Artist *artist_directory[NUM_CHARS];
void initialize() { // 배열 초기화 함수
for (int i = 0; i < NUM_CHARS; i++)
artist_directory[i] = NULL;
}
void add_song(char *artist, char *title, char *path) {
// find if the artist already exists
// return NULL if not
Artist *ptr_artist = find_artist(artist);
if (ptr_artist == NULL) {
}
else {
}
}
Artist *find_artist(char *name) {
Artist *p = artist_directory[(unsigned char)name[0]];
while (p != NULL && strcmp(p->name, name) < 0)
p = p->next;
if (p != NULL && strcmp(p->name, name) == 0)
return p;
else
return NULL;
}
p 변수는 Artist 의 이름의 첫번째 글짜이다.
'💡 자료구조' 카테고리의 다른 글
Music Library Program 구현 시작 (0) | 2021.08.19 |
---|---|
이중연결리스트 (0) | 2021.08.10 |
연결리스트 - 다항식 (0) | 2021.08.04 |
연결리스트 - 함수들 정리 (0) | 2021.08.04 |
연결리스트 - 순회하기 (0) | 2021.08.04 |