# CS Study/DS Algorithm
[자료구조] 이중 연결 리스트 (Doubly Linked List) 를 이용한 mp3 음악 재생 프로그램 - 양방향 순회(검색, 추가, 삭제,
dream_for
2021. 6. 7. 16:20
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char* element;
typedef struct DListNode {
struct DListNode* llink;
struct DListNode* rlink;
element data;
}DListNode;
DListNode* current; // 현재 위치(현재 play되는 곡)
void init(DListNode* head) {
head->rlink = head;
head->llink = head;
}
void dinsert(DListNode* prev, element data) {
DListNode* new_node = (DListNode*)malloc(sizeof(DListNode));
new_node->data = (char*)malloc(sizeof(char) * (strlen(data) + 1));
strcpy(new_node->data,data);
printf("data [%s]의 길이 : %d\n", new_node->data, strlen(new_node->data));
// element가 char[100] 인 경우 - malloc (x)
new_node->rlink = prev->rlink;
new_node->llink = prev;
prev->rlink->llink = new_node;
prev->rlink = new_node;
}
void ddelete(DListNode* head, DListNode* removed) {
if (removed == head) return;
else {
removed->llink->rlink = removed->rlink;
removed->rlink->llink = removed->llink;
if (removed == current) current = current->rlink;
free(removed);
}
}
void free_node(DListNode* head) {
DListNode* p = head->rlink, * next;
while (p != head) {
next = p->rlink;
free(p);
p = next;
}
}
void search(DListNode *head, element data) {
DListNode* p = head->rlink;
for (;p != head;p = p->rlink) {
if (strcmp(p->data, data) == 0) {
p->rlink->llink = p->llink;
p->llink->rlink = p->rlink;
ddelete(head, p);
printf("%s를 성공적으로 플레이어에서 삭제\n", data);
return;
}
}
printf("%s 탐색 실패\n\n", data);
}
void print_dlist(DListNode* head) {
DListNode* p = head->rlink; // 첫번째 노드의 주소 대입
for (;p != head;p = p->rlink) {
if (p == current)
printf("<-| #%s# |-> ", p->data);
else
printf("<-| %s |-> ", p->data);
}
printf("\n\n");
}
int main() {
char ch; // command < > q
char title[100];
char song1[] = "Mammamia";
char song2[] = "Dancing Queen";
char song3[] = "Fernando";
DListNode* head = (DListNode*)malloc(sizeof(DListNode)); // 헤드 노드
init(head);
dinsert(head, song1);
dinsert(head, song2);
dinsert(head, song3);
current = head->rlink; // 현재 play되는 곡 - current 포인터는 첫번째 데이터를 담은 노드
print_dlist(head);
do {
printf("\n명령어를 입력하시오(<, >, a, d, q) : ");
ch = getchar();
switch (ch) {
case 'a':
getchar();
printf("새로 추가할 곡명 : ");
gets(title);
dinsert(head, title);
break;
case 'd':
getchar();
printf("삭제하고 싶은 곡명 : ");
gets(title);
search(head, title);
break;
case '<': // 이전 곡으로 이동
current = current->llink; // left link로 이동
if (current == head) // 헤드 노드인 경우 예외처리 -> 헤드의 왼쪽
current = head->llink;
getchar();
break;
case '>': // 다음 곡으로 이동
current = current->rlink; // right link로 이동
if (current == head) // 헤드 노드인 경우 예외처리 -> 헤드의 오른쪽
current = head->rlink;
getchar();
break;
}
printf("\n---- %s ---- playing\n", current->data);
print_dlist(head);
//getchar(); // 줄바꿈 문자 제거
} while (ch != 'q');
printf("\n\ndelete\n");
for (int i = 0;i < 5;i++) {
print_dlist(head);
ddelete(head, head->rlink); // 헤드 노드의 오른쪽 노드들을 삭제
}
free(head);
return 0;
}
<추가 구현>
add-insert / search / delete
곡명 입력받아 리스트에 곡 추가
삭제할 곡 검색하여, 탐색에 성공하면 해당 곡 삭제
do {
printf("\n명령어를 입력하시오(<, >, a, d, q) : ");
ch = getchar();
switch (ch) {
case 'a':
getchar();
printf("새로 추가할 곡명 : ");
gets(title);
dinsert(head, title);
break;
case 'd':
getchar();
printf("삭제하고 싶은 곡명 : ");
gets(title);
search(head, title);
break;
case '<': // 이전 곡으로 이동
current = current->llink; // left link로 이동
if (current == head) // 헤드 노드인 경우 예외처리 -> 헤드의 왼쪽
current = head->llink;
getchar();
break;
case '>': // 다음 곡으로 이동
current = current->rlink; // right link로 이동
if (current == head) // 헤드 노드인 경우 예외처리 -> 헤드의 오른쪽
current = head->rlink;
getchar();
break;
}
printf("\n---- %s ---- playing\n", current->data);
print_dlist(head);
//getchar(); // 줄바꿈 문자 제거
} while (ch != 'q');
완성 !
728x90
반응형