이제부터 이중연결리스트를 응용한 알고리즘을 살펴보겠습니다.
다음은 Music Library Program의 실행예입니다.
다음은 저장된 음악 프로그램 목록입니다. 아티스트와 음악 저장경로를 구분하기위해 #을 사용하였습니다.
다음은 Artist,Song,path간에 자료구조를 나타낸 그림입니다. 좀 더 자세히 살펴보면, Artist 노드안에 이중연결리스트로 구현된 SNode가 존재하고 하나의 SNode안에 Song노드가 존재하여 해당 Song의 정보를 나타내고 있습니다. 여기서 주의해야 할 점은 Song은 SNode안의 하나의 데이터일 뿐 연결리스트가 아닙니다.
이처럼 번거롭게 자료구조를 편성한 이유는 즉, 노드와 데이터를 분리하는 이유는 노래들에 대해서 다양한 접근경로를 제공하기 위해서입니다. 예를들어 가장최근에 들었던 노래들의 목록을 만들고자 할대 Artist에 대한 Song이 이미 연결리스트로 묶여있다면 특정한 Song을 하나씩 뽑아오기가 매우 번거롭기 때문입니다.
Artist가 여러명 존재함으로 artist들을 이니셜에 따라 분류해서 각 그룹을 하나의 단방향 연결리스트로 저장한다.
특정 곡을 찾거나 삭제할때 우리는 곡 이름이 아니라 곡의 인덱스 번호로 실행되기때문에 곡의 index번호와 관련된 자료구조를 추가로 생성합니다.
< 프로그램을 여러 개의 소스파일로 구성하기 >
- C 프로그램은 여러 개의 소스파일들로 구성된다.
- 관습적으로 각각의 소스파일은 확장자.c를 가진다.
- 하나의 소스파일은 main이라는 이름의 함수를 가져야 한다.
- 프로그램을 여러 개의 소스 파일로 분할할 경우 장점
- 서로 연관된 함수들과 변수들이 하나의 파일에 있으므로 프로그램의 구조가 좀더 알기 쉽고 명료해진다.
- 각각의 소스파일들을 개별적으로 컴파일 할 수 있으므로 컴파일 시간이 절약된다.
- 소프트웨어 재사용이 용이하다.
< 서로 연관된 함수들과 변수들을 하나의 파일에 넣는다 >
1. 입력을 라인단위로 읽거나 문자열이나 토큰의 처리와 관련된 함수들을 하나의 소스파일 string_tools.c에 넣는다.
2. 음원 데이터를 추가,검색,삭제,관리하는 일을 하는 함수들은 다른 하나의 소스파일 library.c에 넣는다.
3. main함수와 사용자의 명령어를 처리하는 process_command함수등은 또 다른 하나의 파일 main.c에 둔다.
< 여러 개의 소스파일로 분할할 경우 해결해야 할 문제점 >
- 어떻게 다른 파일에 정의되어 있는 함수를 호출할 수 있는가?
- 어떻게 서로 다른 파일들이 매크로(상수등)나 타입정의를 공유할 것인가?
< 어떻게 다른 파일에 정의되어 있는 변수를 사용할 것인가? >
변수의 선언(declaration)과 정의(definition)의 구분
- 선언 : 컴파일러에게 변수의 존재를 알려 줌
- 정의 : 실제로 메모리를 할당
변수는 여러 번 선언될 수 있다. 하지만 정의는 한번만 해야 한다.
선언과 정의를 동시에 하는 방법
- int i;
키워드 extern을 이용하여 변수를 정의하지 않고 선언만 할 수 있음. 즉, 컴파일러에게 변수i와 배열a가 다른 파일에 정의되어 있음을 알려주는 역할
- extern int i;
- exter int a[];
공유 변수의 선언은 해더 파일에 둔다.
공유 변수를 사용하는 모든 소스 파일은 헤더 파일을 include한다.
소스 파일 중 오직 한 곳에서 공유 변수를 정의한다.
< 중첩된 Include >
- 중복된 해더 파일이 항상 오류인 것인 아니다.
- 매크로 정의,함수 프로토타입,그리고 외부(extern)변수의 선언은 여러 번 중복되어도 상관 없다.
- 하지만 타입정의가 중복되는것은 컴파일러 오류를 야기합니다.
< 해더 팡일의 중복 방지 >
- 중복된 해더 파일 문제를 해결하기 위해 #ifndef-#endif지시어를 이용한다.
- 가령 boolean.h파일이 중복 include되는것을 방지하기 위해서
'Language > 자료구조' 카테고리의 다른 글
Stack의 개념과 구현 (0) | 2021.12.06 |
---|---|
[15] C review < 이중연결리스트 > 과제 수정 필요 (0) | 2021.11.29 |
[14] C review < 연결리스트 - 다항식 > (0) | 2021.11.27 |
[13] C review < 연결리스트의 순회 > (0) | 2021.11.26 |
[12] C review < 연결리스트의 제거 > (0) | 2021.11.26 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!