Lab 5. 실습문제 (Double linked list)-1_해답.hwp

Similar documents
Lab 3. 실습문제 (Single linked list)_해답.hwp

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Chapter 4. LISTS

슬라이드 1

리스트 (list), 선형리스트 (linear list): 순서를가진항목들의모임 집합 : 항목간의순서의개념이없음 L = n ( item0, item1,..., item -1) l 리스트의예 l 요일 : ( 일요일, 월요일,, 토요일 ) l 한글자음의모임 : ( ㄱ, ㄴ

1장. 리스트

11장 포인터

원형연결리스트에대한설명중틀린것은 모든노드들이연결되어있다 마지막에삽입하기가간단한다 헤더노드를가질수있다 최종노드포인터가 NULL이다 리스트의 번째요소를가장빠르게찾을수있는구현방법은무엇인가 배열 단순연결리스트 원형연결리스트 이중연결리스트 단순연결리스트의노드포인터 가마지막노드를

chap 5: Trees

06장.리스트

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

슬라이드 1

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

Chapter 4. LISTS

Chapter 4. LISTS

5.스택(강의자료).key

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

1. 리스트개념 리스트 (list) 고정된길이의자료 ( 원소 ) 들을순차적으로나열해놓은집합을가르키는자료구조의추상적인개념 순서를가진항목들의모임 집합 (set) : 항목간의순서의개념이없음 리스트의예 요일 : ( 일요일, 월요일,, 토요일 ) 한글자음의모임 : (ᄀ,ᄂ,,ᄒ

<4D F736F F F696E74202D20C1A637C0E52DB0EDB1DEBFACB0E1B8AEBDBAC6AE2E >

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

리스트구현방법 배열 (array) 을이용하는방법 구현이간단 삽입, 삭제동작에따른원소이동. 항목의개수제한, 정적기억공간할당. 메모리낭비, 오버플로우 연결리스트 (linked list) 를이용하는방법 구현이복잡 삽입, 삭제가효율적 크기가제한되지않음 Lecture 03_Li

리스트연산, 검색 + 삽입 + 삭제 새로운항목을리스트의처음, 중간, 끝에추가. 기존의항목을리스트의임의의위치에서삭제. 모든항목을삭제. 기존항목을대치 (replace). 리스트가특정항목을가지고있는지를검색 (search). 리스트의특정위치의항목을반환. 리스트안의항목의개수를센

슬라이드 1

Microsoft PowerPoint - chap4_list

03장.스택.key

Microsoft PowerPoint - 자료구조2008Chap06

슬라이드 1

슬라이드 1

슬라이드 1

PowerPoint 프레젠테이션

슬라이드 1

K&R2 Reference Manual 번역본

Microsoft PowerPoint - 06-List.ppt

untitled

03_queue

슬라이드 1

untitled

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

4장

Chapter #01 Subject

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

C 언어 강의노트


Microsoft PowerPoint - chap13-입출력라이브러리.pptx

Chap 6: Graphs

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

Microsoft PowerPoint - chap06-2pointer.ppt

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

<4D F736F F F696E74202D FBFACB0E120C0DAB7E1B1B8C1B6205BC8A3C8AF20B8F0B5E55D>

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

Contents v 학습목표 자료구조큐에대한개념을스택과비교하여이해한다. 큐의특징과연산방법에대해알아본다. 순차표현방법을이용한큐와연결표현방법을이용한큐를구현해본다. 큐의응용방법을알아본다. v 내용 큐 큐의구현 큐의응용 2/74

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

PowerPoint 프레젠테이션

금오공대 컴퓨터공학전공 강의자료

PowerPoint 프레젠테이션

중간고사 (자료 구조)

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

Algorithms

01_List

슬라이드 1

기초컴퓨터프로그래밍

1장. 유닉스 시스템 프로그래밍 개요

chap01_time_complexity.key

11장 포인터

Microsoft PowerPoint - chap10-함수의활용.pptx

KNK_C_05_Pointers_Arrays_structures_summary_v02

Microsoft PowerPoint - ch07 - 포인터 pm0415

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

Microsoft PowerPoint - 07-chap05-Stack.ppt

C프로-3장c03逞풚

윤성우의 열혈 TCP/IP 소켓 프로그래밍

UI TASK & KEY EVENT

PowerPoint Template

슬라이드 1

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

untitled


02장.배열과 클래스

PowerPoint 프레젠테이션

슬라이드 1

Microsoft PowerPoint - chap11-포인터의활용.pptx

untitled

untitled

슬라이드 1

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

BMP 파일 처리


UI TASK & KEY EVENT

Microsoft PowerPoint - Chapter14_17.pptx

Microsoft PowerPoint - Lesson14.pptx

Microsoft PowerPoint - Lesson14.pptx

C 언어 프로그래밊 과제 풀이

본 강의에 들어가기 전

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - chap-11.pptx

쉽게 풀어쓴 C 프로그래밍

Transcription:

Lab 5. Doubly-linked list 의구현 실험실습일시 : 2009. 4. 13. 담당교수 : 정진우 담당조교 : 곽문상 보고서제출기한 : 2009. 4. 19. 학과 : 학번 : 성명 : 실습과제목적 : 이론시간에배운 Doubly-linked list를실제로구현할수있다. 실습과제내용 : 주어진소스를이용해 Doubly-linked list의각함수를구현한다. 실습순서 단계 1. 주어지는코드와함수설계를참고해, mp3 플레이어의플레이리스트 (play list) 관리프로그램을구현하시오. 해당플레이리스트는원형이중-연결리스트로구현해야하며, 구현해야하는함수와자료구조, main 함수는주어진코드를이용해서구현해야한다. #include <stdio.h> #include <conio.h> #include <stdlib.h> //MP3 플레이어의최대용량 128MB #define MAX 128 // 한곡의용량 4MB #define SONGSIZE 4 // 리스트입력모드 flag #define NORMAL 0 #define FIRST 1 // 리스트노드구조체 struct ListNode char *title; // 제목 char *singer; // 가수 struct ListNode *next; // 다음노드의포인터 struct ListNode *previous; // 이전노드의포인터 ; typedef struct ListNode LISTNODE; // 리스트구조체 struct List int listsize; LISTNODE *play; LISTNODE *first; ; typedef struct List LIST; // 리스트의크기 // 현재재생중인곡 // 리스트의첫번째곡

void initlist(list *list); // 리스트초기화함수 void printlist(list *list); // 리스트출력함수 bool isempty(list *list); // 리스트가비어있는지확인하는함수 bool isfull(list *list); // 용량이가득차있는지확인하는함수 void insertmusic(list *list, int mode); // 곡을추가하는함수 void insertmusicsub(list *list, LISTNODE *node); // 리스트에노드추가 void insertmusicfirstsub(list *list, LISTNODE *node); // 리스트의처음위치에노드추가 void deletemusic(list *list); // 곡을삭제하는함수 void deletemusicsub(list *list, LISTNODE *node); // 리스트에서노드를삭제하는함수 void moveprev(list *list); // 앞곡으로이동 void movenext(list *list); // 뒷곡으로이동 void main() LIST *list; char cmd; // 리스트에동적으로메모리할당 list = (LIST *)malloc(sizeof(list)); // 리스트초기화 initlist(list); do printf("**************** Choose Command!! ******************* n"); printf("+: Insert song S: Insert song in the first n"); printf("-: Delete song P: Play previous song N: Play next song n"); printf("f: full check E: empty check Q: Quit n"); printf("***************************************************** n"); // 리스트출력 printlist(list); // 커맨드입력 printf("command: "); cmd = getch(); // 커맨드는무조건대문자로입력 cmd = toupper(cmd); putch(cmd); printf(" n"); switch (cmd) case '+' : // 곡추가 insertmusic(list,normal); case 'S' : // 처음위치에곡추가 insertmusic(list,first);

case '-' : // 곡삭제 deletemusic(list); case 'E' : // 비어있는지확인 if (isempty(list)) printf ("List is empty! n"); printf ("List isn't empty n"); case 'F' : // 가득찼는지확인 if (isfull(list)) printf ("List is full! n"); printf ("List isn't full! n"); case 'P' : // 왼쪽으로커서이동 moveprev(list); case 'N' : // 오른쪽으로커서이동 movenext(list); case 'Q' : // 종료 default : // 잘못된커맨드입력시 printf(" nwrong command! Retry! n"); while ( cmd!='q' ); 1) initlist(), isempty(), isfull(), printlist() 함수는아래코드를참고할것. initlist() 함수는리스트를초기화하는함수로리스트의멤버인 first, play, listsize를각각 0과 NULL로초기화한다. isempty() 와 isfull() 은리스트의상태를확인하는함수로 isempty() 는리스트가비어있는지확인하는함수로 listsize가 0이면 true를반환하고 1이상이면 false를반환한다. isfull() 은리스트에들어있는음악파일들의크기를계산해 ( 파일한개당크기는 4MB로가정 ) 최대크기를벗어나는지를확인하는함수로최대크기를넘어가면 true, 아닌경우에는 false를반환한다. printlist() 함수는리스트에들어있는곡을화면에출력해주는함수로각리스트노드의가수, 제목을순서대로출력한다. // 리스트초기화함수 void initlist(list *list) // 리스트구조체의멤버를각각초기화한다. // 리스트크기 = 0, 커서와첫번째노드 = NULL list->first = list->play = NULL; list->listsize = 0;

// 리스트가비어있는지확인 bool isempty(list *list) if (list->listsize == 0) return true; return false; // 용량이가득차있는지확인 bool isfull(list *list) if (list->listsize*songsize >= MAX) return true; return false; // 리스트출력 void printlist(list *list) int nnum = 1; // 임시사용포인터선언 LISTNODE *tempcursor; // 리스트의첫노드를가리킴 tempcursor = list->first; if (isempty(list)) // 리스트가비어있는경우 printf("list is empty! n"); printf("====================================== n"); printf("play : %s, t%s n",list->play->singer,list->play->title); printf("====================================== n"); do // Play list 출력 -> [ 곡번호 ] : [ 가수 ], [ 제목 ] printf("%d : %s, t%s n",nnum,tempcursor->singer,tempcursor->title); tempcursor = tempcursor->next; nnum++; while(tempcursor!= list->first); printf(" n");

2) 리스트에곡을추가하는함수 void insertmusic(list *list, int mode) 의 sub 함수들을구현하시오. 이함수는매개변수로받는 mode의값에따라 NORMAL 이면 void insertmusicsub(list *list, LISTNODE *node) 함수를호출하고 FIRST이면 void insertmusicfirstsub(list *list, LISTNODE *node) 를호출한다. void insertmusicsub(list *list, LISTNODE *node) 은현재플레이되고있는곡의다음위치에곡을추가하고플레이를하게하는함수이다. 매개변수로 LIST형의 list포인터와 LISTNODE 형의포인터를받으며매개변수 node는리스트에추가돼야하는노드이다. void insertmusicfirstsub(list *list, LISTNODE *node) 는앞의 sub함수와마찬가지역할을하지만리스트의제일처음에매개변수 node를추가하는함수이다. 위의두 sub 함수들은삽입이불가능한상황 (ex) 리스트가가득차있는경우 ) 에는그에따른에러메시지를출력해야한다. void insertmusic(list *list,int mode) // 새로운노드선언 LISTNODE *tempnode; // 새로운노드에동적메모리할당후 data 저장 tempnode = (LISTNODE *)malloc(sizeof(listnode)); tempnode->title = (char *)malloc(sizeof(char)*20); tempnode->singer = (char *)malloc(sizeof(char)*20); printf ("========================================== n"); // 가수입력 printf ("Singer : "); gets(tempnode->singer); // 제목입력 printf ("Title : "); gets(tempnode->title); printf(" n"); // sub 함수호출 if (mode == NORMAL) insertmusicsub(list, tempnode); if (mode == FIRST) insertmusicfirstsub(list, tempnode); void insertmusicsub(list *list, LISTNODE *node) if(isfull(list)) printf("list is full! Can't insert. n"); // 리스트가비어있는경우 list->first = node; list->play = node;

node->next = NULL; node->previous = NULL; if(list->play->next == NULL) // 리스트의끝에삽입할경우 node->next = NULL; node->previous = list->play; list->play->next = node; // 리스트에노드가존재하는경우 node->next = list->play->next; list->play->next->previous = node; list->play->next = node; node->previous = list->play; list->listsize++; // 리스트에 data를입력하는함수 void insertmusicfirstsub(list *list, LISTNODE *node) if(isfull(list)) printf("list is full! Can't insert. n"); // 리스트가비어있는경우 list->first = node; list->play = node; node->next = NULL; node->previous = NULL; // 리스트의처음에삽입할경우 list->first->previous = node; node->next = list->first; node->previous = NULL; list->first = node; list->listsize++;

3) 리스트에서현재플레이중인곡을삭제하는 void deletemusic(list *list) 의 sub 함수 void deletemusicsub(list *list, LISTNODE *node) 를구현하시오. 매개변수로받는 list 의현재플레이중인곡을리스트에서삭제하고, 그정보를출력해주는함수이다. void deletemusicsub(list *list, LISTNODE *node) 함수는매개변수로 LIST형의포인터 list를받아현재플레이중인곡을삭제하고그곡의정보를두번째매개변수인 node에저장하는함수이다. 위 sub 함수는삭제가불가능한상황 (ex) 리스트가비어있는경우 ) 에는그에따른에러메시지를출력해야한다. void deletemusic(list *list) // 삭제된노드의 data를임시저장할변수 LISTNODE *deletednode; deletednode = (LISTNODE *)malloc(sizeof(listnode)); deletednode->singer = NULL; deletednode->title = NULL; deletemusicsub(list, deletednode); printf (" ndeleted song is %s's %s n",deletednode->singer,deletednode->title); free(deletednode); // 리스트에서 data를삭제하는함수 void deletemusicsub(list *list, LISTNODE *node) printf("list is empty! Can't delete. n"); node->singer = list->play->singer; node->title = list->play->title; // 리스트에노드가한개만있는경우 if(list->listsize == 1) list->play = NULL; list->first = NULL; // 커서가리스트의첫노드에있는경우 if(list->first == list->play) list->first = list->play->next; list->play->previous = NULL;

// 커서가리스트의마지막노드에있는경우 if(list->play->next == NULL) list->play->previous->next = NULL; list->play = list->play->previous; // 그외의경우 list->play->previous->next = list->play->next; list->play->next->previous = list->play->previous; list->listsize--; 4) 플레이리스트에서재생곡을바꾸는함수 void moveprev (LIST *list) 와 void movenext (LIST *list) 를구현한다. 이함수들은각각현재재생곡을앞의곡과뒤의곡으로변경시키는함수이다. 매개변수로 LIST형의포인터 list를받고반환값은없다. 두함수는커서를이동시킬수없는상황에서이동을시키려고하면에러메시지를출력하며변경이불가능하게구현되어야한다. (ex) 리스트가비어있거나, 리스트에노드가한개만있는경우 ) // 앞곡으로변경 void moveprev(list *list) printf("list is empty! Can't move. n"); // 리스트에노드가 1개밖에없거나커서가첫노드에있는경우 if(list->play == list->first list->listsize == 1) printf("the course is in the first item! Can't move. n"); // 커서를왼쪽으로이동 list->play = list->play->previous; // 뒷곡으로변경 void movenext(list *list)

printf("list is empty! Can't move. n"); // 리스트에노드가 1개밖에없거나커서가마지막노드에있는경우 if(list->play->next == NULL list->listsize == 1) printf("the course is in the last item! Can't move. n"); // 커서를오른쪽으로이동 단계 2. 단계 1에서완성된프로그램을실행시켜각함수들을테스트해보고그결과화면을캡쳐하시오. Extra 문제 (+3점). 단계 2까지완성된프로그램에서리스트내의모든곡들을삭제하는 void clearlist(list *list) 함수를작성하시오. 리스트의포인터만을초기화하는것뿐만아니라, 동적할당을통해할당받은각노드의메모리공간을모두해제해야한다. Extra 문제 (+1점). 단계 2까지완성된프로그램에서 LISTNODE의자료구조와 insertmusic() 와 sub 함수, deletemusic() 와 sub함수, isfull() 을수정해각곡의크기를다르게저장할수있도록하시오. LISTNODE의자료구조에파일의크기를저장할수있는필드 unsigned int filesize를추가하시오. 이에따라 insertmusic() 에서는용량을입력하는코드를추가하고, deletemusic() 에서는삭제된파일의크기를출력하도록변경하시오. isfull() 함수에서는리스트에있는모든노드들의크기를합산해최대크기와비교하도록수정하시오. 과제수행결과 ( 결과화면및소감 )

[Source] #include <stdio.h> #include <conio.h> #include <stdlib.h> //MP3 플레이어의최대용량 128MB #define MAX 128 // 한곡의용량 4MB #define SONGSIZE 4 // 리스트입력모드 flag #define NORMAL 0 #define FIRST 1 // 리스트노드구조체 struct ListNode char *title; // 제목 char *singer; // 가수 struct ListNode *next; // 다음노드의포인터 struct ListNode *previous; // 이전노드의포인터 ; typedef struct ListNode LISTNODE; // 리스트구조체 struct List int listsize; LISTNODE *play; LISTNODE *first; ; typedef struct List LIST; // 리스트의크기 // 현재재생중인곡 // 리스트의첫번째곡 void initlist(list *list); // 리스트초기화함수 void printlist(list *list); // 리스트출력함수 bool isempty(list *list); // 리스트가비어있는지확인하는함수 bool isfull(list *list); // 용량이가득차있는지확인하는함수 void insertmusic(list *list, int mode); // 곡을추가하는함수 void insertmusicsub(list *list, LISTNODE *node); // 리스트에노드추가 void insertmusicfirstsub(list *list, LISTNODE *node); // 리스트의처음위치에노드추가 void deletemusic(list *list); // 곡을삭제하는함수 void deletemusicsub(list *list, LISTNODE *node); // 리스트에서노드를삭제하는함수 void moveprev(list *list); // 앞곡으로이동 void movenext(list *list); // 뒷곡으로이동 void main() LIST *list; char cmd; // 리스트에동적으로메모리할당 list = (LIST *)malloc(sizeof(list));

// 리스트초기화 initlist(list); do printf("**************** Choose Command!! ******************* n"); printf("+: Insert song S: Insert song in the first n"); printf("-: Delete song P: Play previous song N: Play next song n"); printf("f: full check E: empty check Q: Quit n"); printf("***************************************************** n"); // 리스트출력 printlist(list); // 커맨드입력 printf("command: "); cmd = getch(); // 커맨드는무조건대문자로입력 cmd = toupper(cmd); putch(cmd); printf(" n"); switch (cmd) case '+' : // 곡추가 insertmusic(list,normal); case 'S' : // 처음위치에곡추가 insertmusic(list,first); case '-' : // 곡삭제 deletemusic(list); case 'E' : // 비어있는지확인 if (isempty(list)) printf ("List is empty! n"); printf ("List isn't empty n"); case 'F' : // 가득찼는지확인 if (isfull(list)) printf ("List is full! n"); printf ("List isn't full! n"); case 'P' : // 왼쪽으로커서이동 moveprev(list); case 'N' : // 오른쪽으로커서이동 movenext(list); case 'Q' : // 종료

while ( cmd!='q' ); default : // 잘못된커맨드입력시 printf(" nwrong command! Retry! n"); // 리스트초기화함수 void initlist(list *list) // 리스트구조체의멤버를각각초기화한다. // 리스트크기 = 0, 커서와첫번째노드 = NULL list->first = list->play = NULL; list->listsize = 0; // 리스트가비어있는지확인 bool isempty(list *list) if (list->listsize == 0) return true; return false; // 용량이가득차있는지확인 bool isfull(list *list) if (list->listsize*songsize >= MAX) return true; return false; // 리스트출력 void printlist(list *list) int nnum = 1; // 임시사용포인터선언 LISTNODE *tempcursor; // 리스트의첫노드를가리킴 tempcursor = list->first; if (isempty(list)) // 리스트가비어있는경우 printf("list is empty! n"); printf("====================================== n"); printf("play : %s, t%s n",list->play->singer,list->play->title); printf("====================================== n"); do

// Play list 출력 -> [ 곡번호 ] : [ 가수 ], [ 제목 ] printf("%d : %s, t%s n",nnum,tempcursor->singer,tempcursor->title); tempcursor = tempcursor->next; nnum++; while(tempcursor!= NULL); printf(" n"); void insertmusic(list *list,int mode) // 새로운노드선언 LISTNODE *tempnode; // 새로운노드에동적메모리할당후 data 저장 tempnode = (LISTNODE *)malloc(sizeof(listnode)); tempnode->title = (char *)malloc(sizeof(char)*20); tempnode->singer = (char *)malloc(sizeof(char)*20); printf ("========================================== n"); // 가수입력 printf ("Singer : "); gets(tempnode->singer); // 제목입력 printf ("Title : "); gets(tempnode->title); printf(" n"); // sub 함수호출 if (mode == NORMAL) insertmusicsub(list, tempnode); if (mode == FIRST) insertmusicfirstsub(list, tempnode); void insertmusicsub(list *list, LISTNODE *node) if(isfull(list)) printf("list is full! Can't insert. n"); // 리스트가비어있는경우 list->first = node; list->play = node; node->next = NULL; node->previous = NULL; if(list->play->next == NULL) // 리스트의끝에삽입할경우 node->next = NULL; node->previous = list->play;

list->play->next = node; // 리스트에노드가존재하는경우 node->next = list->play->next; list->play->next->previous = node; list->play->next = node; node->previous = list->play; list->listsize++; // 리스트에 data를입력하는함수 void insertmusicfirstsub(list *list, LISTNODE *node) if(isfull(list)) printf("list is full! Can't insert. n"); // 리스트가비어있는경우 list->first = node; list->play = node; node->next = NULL; node->previous = NULL; // 리스트의처음에삽입할경우 list->first->previous = node; node->next = list->first; node->previous = NULL; list->first = node; list->listsize++; void deletemusic(list *list) // 삭제된노드의 data를임시저장할변수 LISTNODE *deletednode; deletednode = (LISTNODE *)malloc(sizeof(listnode)); deletednode->singer = NULL; deletednode->title = NULL;

deletemusicsub(list, deletednode); printf (" ndeleted song is %s's %s n",deletednode->singer,deletednode->title); free(deletednode); // 리스트에서 data를삭제하는함수 void deletemusicsub(list *list, LISTNODE *node) printf("list is empty! Can't delete. n"); node->singer = list->play->singer; node->title = list->play->title; // 리스트에노드가한개만있는경우 if(list->listsize == 1) list->play = NULL; list->first = NULL; // 커서가리스트의첫노드에있는경우 if(list->first == list->play) list->first = list->play->next; list->play->previous = NULL; // 커서가리스트의마지막노드에있는경우 if(list->play->next == NULL) list->play->previous->next = NULL; list->play = list->play->previous; // 그외의경우 list->play->previous->next = list->play->next; list->play->next->previous = list->play->previous; list->listsize--; // 앞곡으로변경 void moveprev(list *list)

printf("list is empty! Can't move. n"); // 리스트에노드가 1개밖에없거나커서가첫노드에있는경우 if(list->play == list->first list->listsize == 1) printf("the course is in the first item! Can't move. n"); // 커서를왼쪽으로이동 list->play = list->play->previous; // 뒷곡으로변경 void movenext(list *list) printf("list is empty! Can't move. n"); // 리스트에노드가 1개밖에없거나커서가마지막노드에있는경우 if(list->play->next == NULL list->listsize == 1) printf("the course is in the last item! Can't move. n"); // 커서를오른쪽으로이동