💡 자료구조

Music Library Program - add_song 함수

ji-hyun 2021. 8. 19. 20:49

※ 인프런 강의 "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