관리 메뉴

공부 기록장 💻

[자료구조] 이중 연결 리스트 (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
반응형
Comments