일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 코딩테스트
- 카카오
- nestjs auth
- 카카오 코테
- 구조체배열
- 해시
- TypeORM
- 알고리즘
- 시스템호출
- AWS
- C언어
- @Component
- C++
- spring boot
- Spring
- 스프링
- git
- python
- nestJS
- 컴포넌트스캔
- thymeleaf
- 카카오 알고리즘
- @Autowired
- 코테
- Nodejs
- OpenCV
- 프로그래머스
- nestjs typeorm
- 가상면접사례로배우는대규모시스템설계기초
- 파이썬
Archives
- Today
- Total
공부 기록장 💻
[자료구조] 이중 연결 리스트 (Doubly Linked List) 를 이용한 mp3 음악 재생 프로그램 - 양방향 순회(검색, 추가, 삭제, 본문
# 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
반응형
'# CS Study > DS Algorithm' 카테고리의 다른 글
[자료구조] 이진 트리(Binary Tree)의 구조와 전위, 중위, 후위 순환/반복 순회 (0) | 2021.09.23 |
---|---|
[자료구조] 스택 / 큐 / 연결리스트 정리 (0) | 2021.06.07 |
[자료구조] 연결 리스트 (Linked List) 응용 - 특정 위치에 데이터 삽입과 삭제, 선행 노드의 포인터 이용 (0) | 2021.06.07 |
[자료구조] 원형 큐 (Circular Queue) 응용 - 오름차순으로 큐에 데이터 삽입하기 (0) | 2021.06.07 |
[자료구조] 덱 (Deque : Double-Ended-Queue) 의 구조와 구현 - 덱의 전단(front)와 후단(rear)의 입출력 (0) | 2021.06.02 |
Comments