안형준

재생목록만들기, 최근추가목록 완성

1 +
2 +Microsoft Visual Studio Solution File, Format Version 12.00
3 +# Visual Studio 15
4 +VisualStudioVersion = 15.0.28010.2036
5 +MinimumVisualStudioVersion = 10.0.40219.1
6 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Project", "Project\Project.vcxproj", "{488DFF6D-08D7-40A9-B10D-AE7374047D99}"
7 +EndProject
8 +Global
9 + GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 + Debug|x64 = Debug|x64
11 + Debug|x86 = Debug|x86
12 + Release|x64 = Release|x64
13 + Release|x86 = Release|x86
14 + EndGlobalSection
15 + GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 + {488DFF6D-08D7-40A9-B10D-AE7374047D99}.Debug|x64.ActiveCfg = Debug|x64
17 + {488DFF6D-08D7-40A9-B10D-AE7374047D99}.Debug|x64.Build.0 = Debug|x64
18 + {488DFF6D-08D7-40A9-B10D-AE7374047D99}.Debug|x86.ActiveCfg = Debug|Win32
19 + {488DFF6D-08D7-40A9-B10D-AE7374047D99}.Debug|x86.Build.0 = Debug|Win32
20 + {488DFF6D-08D7-40A9-B10D-AE7374047D99}.Release|x64.ActiveCfg = Release|x64
21 + {488DFF6D-08D7-40A9-B10D-AE7374047D99}.Release|x64.Build.0 = Release|x64
22 + {488DFF6D-08D7-40A9-B10D-AE7374047D99}.Release|x86.ActiveCfg = Release|Win32
23 + {488DFF6D-08D7-40A9-B10D-AE7374047D99}.Release|x86.Build.0 = Release|Win32
24 + EndGlobalSection
25 + GlobalSection(SolutionProperties) = preSolution
26 + HideSolutionNode = FALSE
27 + EndGlobalSection
28 + GlobalSection(ExtensibilityGlobals) = postSolution
29 + SolutionGuid = {13F536C0-2A1C-46D1-AC75-9315EF6D367F}
30 + EndGlobalSection
31 +EndGlobal
1 +#pragma once
2 +#include<string>
3 +using namespace std;
4 +#include"SimplifiedType.h"
5 +#include"SortedLinkedList.h"
6 +
7 +class AlbumType {
8 +public:
9 +
10 + AlbumType()
11 + {
12 + AlbumName = "";
13 + ArtistName = "";
14 + } //기본 생성자
15 + ~AlbumType()
16 + {
17 +
18 + } //기본 소멸자
19 + /**
20 +* @brief AlbumType의 생성자이다.
21 +* @pre x
22 +* @post AlbumType이 생성된다.
23 + @param albumname 앨범명
24 + @param artistname 이 앨범을 낸 아티스트명
25 +*/
26 + AlbumType(string albumname, string artistname)
27 + {
28 + AlbumName = albumname;
29 + ArtistName = artistname;
30 + }
31 + AlbumType(const AlbumType& data)
32 + {
33 + AlbumName = data.AlbumName;
34 + ArtistName = data.ArtistName;
35 + }
36 + /**
37 +* @brief AlbumName 을 set한다.
38 +* @pre x
39 +* @post AlbumName is set
40 +* @return x
41 +*/
42 + void SetAlbumName(string Name)
43 + {
44 + AlbumName = Name;
45 + };
46 + /**
47 +* @brief ArtistName을 set한다.
48 +* @pre x
49 +* @post ArtistName is set
50 +* @return x
51 +*/
52 + void SetArtistName(string Name)
53 + {
54 + ArtistName = Name;
55 + };
56 + /**
57 +* @brief get AlbumName
58 +* @pre AlbumName is set
59 +* @post x
60 +* @return AlbumName
61 +*/
62 + string GetAlbumName()
63 + {
64 + return AlbumName;
65 + };
66 + /**
67 +* @brief getArtistName
68 +* @pre ArtistName is set
69 +* @post x
70 +* @return ArtistName
71 +*/
72 + string GetArtistName()
73 + {
74 + return ArtistName;
75 + };
76 + /**
77 +* @brief 비교 연산자
78 +* @pre 비교하려는 두 앨범타입이 초기화되어 있어야한다
79 +* @post x
80 +* @param data 비교하려는 앨범타입
81 +* @return 좌변이크면 false, 우변이크면 true
82 +*/
83 + bool operator<(AlbumType data)
84 + {
85 + if (AlbumName == data.GetAlbumName())
86 + return (ArtistName < data.GetArtistName());
87 + else
88 + return (AlbumName < data.GetAlbumName());
89 + };
90 + /**
91 +* @brief 비교 연산자
92 +* @pre 비교하려는 두 앨범타입이 초기화되어 있어야한다
93 +* @post x
94 +* @param data 비교하려는 앨범타입
95 +* @return 좌변이크면 true, 우변이크면 false
96 +*/
97 + bool operator>(AlbumType data)
98 + {
99 + if (AlbumName == data.GetAlbumName())
100 + return (ArtistName > data.GetArtistName());
101 + else
102 + return (AlbumName > data.GetAlbumName());
103 + };
104 + /**
105 +* @brief 등위연산자
106 +* @pre 비교하려는 두 앨범타입이 초기화되어 있어야한다
107 +* @post x
108 +* @param data 비교하려는 앨범타입
109 +* @return 두 항이 같으면 true 아니면 false
110 +*/
111 + bool operator==(AlbumType data) {
112 + if (AlbumName == data.GetAlbumName() && ArtistName == data.GetArtistName())
113 + return true;
114 + else
115 + return false;
116 + };
117 +private:
118 + string AlbumName; //앨범 이름을 저장할 변수
119 + string ArtistName; //앨범의 아티스트를 저장할 변수
120 +
121 +};
This diff is collapsed. Click to expand it.
1 +
2 +#ifndef _APPLICATION_H
3 +#define _APPLICATION_H
4 +
5 +#include <iostream>
6 +#include <fstream>
7 +#include <string>
8 +#include<sstream>
9 +using namespace std;
10 +
11 +
12 +#include "MusicType.h"
13 +#include"SortedLinkedList.h"
14 +#include"GenreType.h"
15 +#include"AlbumType.h"
16 +#include"ArtistType.h"
17 +#include"ManageType.h"
18 +#include"UnSortedLinkedList.h"
19 +#include"PLType.h"
20 +#define FILENameSIZE 1024
21 +
22 +/**
23 +* application class for item management simply.
24 +*/
25 +class Application
26 +{
27 +public:
28 + /**
29 + * default constructor.
30 + */
31 + Application()
32 + {
33 + m_Command = 0;
34 + RemakeAlbumList = true;
35 + RemakeArtistList = true;
36 + RemakeGenreList = true;
37 + NumofPL = 0;
38 +
39 + }
40 +
41 + /**
42 + * destructor.
43 + */
44 + ~Application()
45 + {
46 + DoublyIter<ArtistType> Atiter(ArtistList);
47 + while (Atiter.NotNull())
48 + {
49 + ArtistType* Atptr = Atiter.GetCurrentPtr();
50 + Atptr->MakeEmptyListinList();
51 + Atiter.Next();
52 + }
53 + m_List.MakeEmpty();
54 + GenreList.MakeEmpty();
55 + AlbumList.MakeEmpty();
56 + };
57 +
58 + /**
59 + * @brief Program driver.
60 + * @pre program is started.
61 + * @post program is finished.
62 + */
63 + void Run();
64 +
65 + /**
66 + * @brief Display command on screen and get a input from keyboard.
67 + * @pre none.
68 + * @post none.
69 + * @return user's command.
70 + */
71 + int GetCommand();
72 +
73 + /**
74 + * @brief Add new record into list.
75 + * @pre list should be initialized.
76 + * @post new record is added into the list.
77 + * @return return 1 if this function works well, otherwise 0.
78 + */
79 + int AddMusic();
80 +
81 + /**
82 + * @brief Display all records in the list on screen.
83 + * @pre none.
84 + * @post none.
85 + */
86 + void DisplayAllMusic();
87 +
88 + /**
89 + * @brief Open a file by file descriptor as an input file.
90 + * @pre a file for reading is exist.
91 + * @post open the file for reading.
92 + * @param fileName a fileName to open for reading.
93 + * @return return 1 if this function works well, otherwise 0.
94 + */
95 + int OpenInFile(char *fileName);
96 +
97 + /**
98 + * @brief Open a file by file descriptor as an output file.
99 + * @pre list should be initialized.
100 + * @post open the file for writing.
101 + * @param fileName a fileName to open for writing.
102 + * @return return 1 if this function works well, otherwise 0.
103 + */
104 + int OpenOutFile(char *fileName);
105 +
106 + /**
107 + * @brief Open a file as a read mode, read all data on the file, and set list by the data.
108 + * @pre The file is not opened.
109 + * @post list holds all records from the file.
110 + * @return return 1 if this function works well, otherwise 0.
111 + */
112 + int ReadDataFromFile();
113 +
114 + /**
115 + * @brief Open a file as a write mode, and write all data into the file,
116 + * @pre The file is not opened.
117 + * @post the list is stored in the output file.
118 + * @return return 1 if this function works well, otherwise 0.
119 + */
120 + int WriteDataToFile();
121 +
122 + /**
123 +* @brief 객체를 생성 후, 문자열을 입력받는다.
124 +* @pre 없다.
125 +* @post SearchByName함수에 문자열이 설정된 객체를 전달한다.
126 +* @return 없다.
127 +*/
128 + void RetreiveRecordByName();
129 +
130 + /**
131 + * @brief inData의 이름 부분을 포함하는 문자열을 찾아 출력한다.
132 + * @pre inData의 이름 부분이 초기화되어있어야 한다.
133 + * @post inData에 알맞은 항목이 복사된다.
134 + * @param inData 이름이 설정되어있고 나머지는 비어있는 Musictype
135 + * @return 없다.
136 + */
137 + void SearchByName(MusicType &inData);
138 +
139 + /**
140 +* @brief 객체를 생성 후, 문자열을 입력받는다.
141 +* @pre 없다.
142 +* @post SearchBySinger함수에 문자열이 설정된 객체를 전달한다.
143 +* @return 없다.
144 +*/
145 + void RetreiveRecordBySinger();
146 +
147 + /**
148 + * @brief inData의 이름 부분을 포함하는 문자열을 찾아 출력한다.
149 + * @pre inData의 이름 부분이 초기화되어있어야 한다.
150 + * @post inData에 알맞은 항목이 복사된다.
151 + * @param inData 이름이 설정되어있고 나머지는 비어있는 Musictype
152 + * @return 없다.
153 + */
154 + void SearchBySinger(MusicType &inData);
155 +
156 +
157 + /**
158 +* @brief 객체를 생성 후, 문자열을 입력받는다.
159 +* @pre 없다.
160 +* @post SearchByAlbum함수에 문자열이 설정된 객체를 전달한다.
161 +* @return 없다.
162 +*/
163 + void RetreiveRecordByAlbum();
164 +
165 + /**
166 + * @brief inData의 이름 부분을 포함하는 문자열을 찾아 출력한다.
167 + * @pre inData의 이름 부분이 초기화되어있어야 한다.
168 + * @post inData에 알맞은 항목이 복사된다.
169 + * @param inData 이름이 설정되어있고 나머지는 비어있는 Musictype
170 + * @return 없다.
171 + */
172 + void SearchByAlbum(MusicType &inData);
173 + /**
174 +* @brief 객체를 생성 후, 문자열을 입력받는다.
175 +* @pre 없다.
176 +* @post SearchByGenre함수에 문자열이 설정된 객체를 전달한다.
177 +* @return 없다.
178 +*/
179 + void RetreiveRecordByGenre();
180 +
181 + /**
182 + * @brief inData의 이름 부분을 포함하는 문자열을 찾아 출력한다.
183 + * @pre inData의 이름 부분이 초기화되어있어야 한다.
184 + * @post inData에 알맞은 항목이 복사된다.
185 + * @param inData 이름이 설정되어있고 나머지는 비어있는 Musictype
186 + * @return 없다.
187 + */
188 + void SearchByGenre(MusicType &inData);
189 + /**
190 + * @brief inData의 Index와 같은 Index를 가진 MusicList의 정보를 찾아온다
191 + * @pre inData의 Index가 초기화 되어 있어야 한다.
192 + * @post inData에 알맞은 항목이 복사된다.
193 + * @param inData Index가 설정되어있고 나머지는 비어있는 Musictype
194 + * @return 없다.
195 + */
196 +
197 + void SearchByIndex(MusicType &indata);
198 + /**
199 + * @brief 사용자에게 Name을 입력받아 SortedList의 Delete함수에 넘겨주는 역할을 한다.
200 + * @pre 없다.
201 + * @post 사용자가 입력한 Name을 가지고 있는 Musictype이 m_List에서 사라진다.
202 + * @return 없다.
203 + */
204 +
205 + void Delete();
206 +
207 + /**
208 + * @brief 사용자에게 Name을 입력받아 SortedList의 Replace함수에 넘겨주는 역할을 한다.
209 + * @pre 없다.
210 + * @post 사용자가 입력한 Name을 가지고 있는 MusicType을 다시 입력받아 갱신한다.
211 + * @return 없다.
212 + */
213 + void Update();
214 + /**
215 + * @brief 최근에 추가된 30곡의 자세한 정보를 화면에 출력
216 + * @pre 없다.
217 + * @post 없다.
218 + * @return 없다.
219 + */
220 + void DIsplayNewMusic();
221 + /**
222 + * @brief Primary key를 이용해 원하는 음악정보가져온다.
223 + * @pre 리스트가 초기화되어야함.
224 + * @post inData에 원하는 곡정보가 담김
225 + * @return 찾으면 1, 아니면 0
226 + * @param key 곡번호를 찾기위한 int형 변수
227 + * @inData 원하는 곡의 정보를 받아오기 위한 변수
228 + */
229 + bool Search(int key, MusicType& inData);
230 + /**
231 + * @brief 장르 리스트에 있는 곡들을 장르에 맞춰 출력
232 + * @pre 없다.
233 + * @post 없다.
234 + * @return 없다.
235 + */
236 + void DisplayMusicbyGenre();
237 +
238 + /**
239 +* @brief 객체를 생성 후, 문자열을 입력받는다.
240 +* @pre 없다.
241 +* @post SearchByNameNGenre함수에 문자열이 설정된 객체를 전달한다.
242 +* @return 없다.
243 +*/
244 + void RetreiveRecordByNameNGenre();
245 +
246 + /**
247 + * @brief inData의 이름 부분을 포함하는 문자열을 찾아 출력한다.
248 + * @pre inData의 이름 부분이 초기화되어있어야 한다.
249 + * @post inData에 알맞은 항목이 복사된다.
250 + * @param inData 이름이 설정되어있고 나머지는 비어있는 Musictype
251 + * @return 없다.
252 + */
253 + void SearchByNameNGenre(MusicType &inData);
254 + /**
255 +* @brief MusicList에 있는 곡을 앨범별로 출력한다.
256 +* @pre 없다.
257 +* @post 없다.
258 +* @return 없다.
259 +*/
260 + void DisplayMusicByAlbum();
261 + /**
262 +* @brief MusicList에 있는 곡을 아티스트별로 나누고, 각 아티스트별 로 앨범을 분류하여 출력한다.
263 +* @pre 없다.
264 +* @post 없다.
265 +* @return 없다.
266 +*/
267 + void DisplayMusicByArtist();
268 + /**
269 +* @brief MusicList에 있는 곡을 Primary Key에 따라 정렬된 순서에 따라 Index를 부여한다
270 +* @pre MusicList에 최소한 하나이상의 곡이 있어야한다.
271 +* @post MusicList의 각 MusicType에 Index가 부여된다
272 +* @return 없다.
273 +*/
274 + void SetMusicIndex();
275 + /**
276 +* @brief MusicList의 Music을 분류하는 하위리스트들을 다시 만들기 위한 조건을 충족시킨다.
277 +* @pre 곡이 추가되거나, 삭제되거나, 변경되어야 한다.
278 +* @post Remake~~List 형의 변수의 값이 모두 true가 된다.
279 +* @return 없다.
280 +*/
281 + void RemakeSubList()
282 + {
283 + RemakeAlbumList = true;
284 + RemakeArtistList = true;
285 + RemakeGenreList = true;
286 + };
287 +
288 + void makePlayList();
289 +
290 + void AddMusicInPL();
291 +
292 + void PrintPL();
293 +
294 +private:
295 + ifstream m_InFile; ///< input file descriptor.
296 + ofstream m_OutFile; ///< output file descriptor.
297 + SortedLinkedList<MusicType> m_List; /// 노래 리스트
298 + UnSortedLinkedList<ManageType> mg_List;
299 + int m_Command; ///< current command number.
300 + SortedLinkedList<AlbumType> AlbumList; //앨범을 분류하기 위한 앨범리스트
301 + SortedLinkedList<ArtistType> ArtistList; //아티스트를 분류하기 위한 아티스트리스트
302 + SortedLinkedList <string> GenreList; //장르를 분류하기 위한 장르 리스트
303 + UnSortedLinkedList<PLType> PlayLists;
304 + //아래의 변수들은 각 하위 리스트를 다시만들어야 할지 판별하는 변수이다.
305 + bool RemakeAlbumList;
306 + bool RemakeArtistList;
307 + bool RemakeGenreList;
308 + int NumofPL;
309 +};
310 +
311 +
312 +
313 +#endif // _APPLICATION_H
314 +
315 +
1 +
2 +#include"ArtistType.h"
3 +
4 +void ArtistType::PrintListinList()
5 +{
6 + DoublyIter<AlbumType> Abiter(AlbumList);
7 + cout << "\t ----------------" << endl;
8 + cout << "\t ƼƮ : " << ArtistName << endl;
9 + while (Abiter.NotNull())
10 + {
11 + cout << "\tٹ" << Abiter.GetCurrentNode().data.GetAlbumName() << endl;
12 + Abiter.Next();
13 + }
14 +}
15 +
16 +ArtistType::ArtistType(const ArtistType& data)
17 +{
18 + ArtistName = data.ArtistName;
19 + AlbumList = data.AlbumList;
20 +
21 +}
...\ No newline at end of file ...\ No newline at end of file
1 +#pragma once
2 +#include"AlbumType.h"
3 +using namespace std;
4 +
5 +class ArtistType {
6 +public:
7 + ArtistType()
8 + {
9 + ArtistName = "";
10 + }
11 + ; //기본 생성자
12 + ~ArtistType()
13 + {
14 + AlbumList.MakeEmpty();
15 + }
16 + ; //기본 소멸자
17 + ArtistType(const ArtistType& data);
18 + /**
19 +* @brief Get ArtistName
20 +* @pre ArtistName is set
21 +* @post x
22 +* @return ArtistName
23 +*/
24 + string GetArtistName()
25 + {
26 + return ArtistName;
27 + };
28 + /**
29 +* @brief set ArtistName
30 +* @pre x
31 +* @post ArtistName is set
32 +*/
33 + void SetArtistName(string Name)
34 + {
35 + ArtistName = Name;
36 + };
37 + /**
38 +* @brief 비교 연산자
39 +* @pre 비교하려는 두 아티스트타입이 초기화되어 있어야한다
40 +* @post x
41 +* @param data 비교하려는 아티스트타입
42 +* @return 좌변이크면 false, 우변이크면 true
43 +*/
44 + bool operator<(ArtistType data)
45 + {
46 + return (ArtistName < data.GetArtistName());
47 + };
48 + /**
49 +* @brief 비교 연산자
50 +* @pre 비교하려는 두 아티스트타입이 초기화되어 있어야한다
51 +* @post x
52 +* @param data 비교하려는 아티스트타입
53 +* @return 좌변이크면 true, 우변이크면 false
54 +*/
55 + bool operator>(ArtistType data)
56 + {
57 + return (ArtistName > data.GetArtistName());
58 + };
59 + /**
60 +* @brief 등위 연산자
61 +* @pre 비교하려는 두 아티스트타입이 초기화되어 있어야한다
62 +* @post x
63 +* @param data 비교하려는 아티스트타입
64 +* @return 두 항이 같으면 true 아니면 false
65 +*/
66 + bool operator==(ArtistType data)
67 + {
68 + if (ArtistName == data.GetArtistName())
69 + return true;
70 + else
71 + return false;
72 + };
73 + /**
74 +* @brief 대입 연산자
75 +* @pre 패러미터로 넘어오는 Artisttype이 초기화되어있어야한다.
76 +* @post this가 data와 같아진다
77 +* @param data 대입하려는 아티스트타입
78 +* @return *this
79 +*/
80 + ArtistType operator=(const ArtistType& data)
81 + {
82 + ArtistName = data.ArtistName;
83 + AlbumList = data.AlbumList;
84 + return *this;
85 + };
86 + /**
87 +* @brief 리스트안의 리스트에 원소를 추가한다
88 +* @pre x
89 +* @post AlbumList에 앨범이 추가된다.
90 +* @param A 추가하려는 앨범타입
91 +*/
92 + void AddListinList(AlbumType &A)
93 + {
94 + AlbumList.Add(A);
95 + };
96 + /**
97 +* @brief 리스트 안의 리스트의 내용을 출력한다.
98 +* @pre 앨범리스트가 초기화되어 있어야 한다.
99 +* @post x
100 +*/
101 + void PrintListinList() ;
102 +
103 + void MakeEmptyListinList()
104 + {
105 + AlbumList.MakeEmpty();
106 + }
107 +private:
108 + SortedLinkedList<AlbumType> AlbumList; //한 아티스트가 가지는 앨범 리스트
109 + string ArtistName;
110 +
111 +};
1 +#pragma once
2 +#ifndef _SORTED_LINKED_LIST_H
3 +#define _SORTED_LINKED_LIST_H
4 +#include"SortedLinkedList.h"
5 +
6 +
7 +template<typename T>
8 +class SortedLinkedList;
9 +
10 +template<typename T>
11 +struct NodeType;
12 +
13 +
14 +
15 +template<typename T>
16 +class DoublyIter {
17 + friend class SortedLinkedList<T>;
18 +
19 +private:
20 + const SortedLinkedList<T>& m_List;
21 + NodeType<T>* CurPointer;
22 +public:
23 + DoublyIter(const SortedLinkedList<T>& list) : m_List(list), CurPointer(list.m_pList)
24 + {}
25 + /**
26 + * @brief 현재 노드를 가리키는 포인터가 null인지 아닌지 판단하는 메서드.
27 + * @pre Iterator has been initialized.
28 + * @post None.
29 + * @return nullptr true, otherwise false.
30 + */
31 + bool NotNull();
32 +
33 + /**
34 + * @brief 현재 노드 포인터의 다음 노드가 null인지 아닌지 판단하는 메서드.
35 + * @pre Iterator has been initialized.
36 + * @post None.
37 + * @return nullptr true, otherwise false.
38 + */
39 + bool NextNotNull();
40 + /**
41 + * @brief 현재 노드 포인터의 이전 노드가 null인지 아닌지 판단하는 메서드.
42 + * @pre Iterator has been initialized.
43 + * @post None.
44 + * @return nullptr true, otherwise false.
45 + */
46 + bool PrevNotNull();
47 + /**
48 + * @brief Get first data of the list.
49 + * @pre Iterator has been initialized.
50 + * @post Current pointer is moved to the first node.
51 + * @return Return first data of the list.
52 + */
53 + T First();
54 +
55 + /**
56 + * @brief Get next data of the current pointer.
57 + * @pre Iterator has been initialized.
58 + * @post Current pointer is moved to the next node.
59 + * @return Return next data of the list.
60 + */
61 + T Next();
62 +
63 + /**
64 + * @brief Get current data of the list and go to the next node. 현재 노드. 객체반환은 return by value
65 + * @pre Iterator has been initialized.
66 + * @post Current pointer is moved to next node.
67 + * @return Return current data of the list.
68 + */
69 + NodeType<T> GetCurrentNode();
70 + /**
71 + * @brief 현재 노드의 data의 주소값을 반환하는 함수
72 + * @pre Iterator has been initialized.
73 + * @post x
74 + * @return Return current data's address
75 + */
76 + T* GetCurrentPtr();
77 + /**
78 + * @brief 마지막 데이터의 포인터를 받는다.
79 + * @pre Iterator has been initialized.
80 + * @post x
81 + * @return Return last data of the list.
82 + */
83 + T Last();
84 + /**
85 + * @brief Curpointer의 이전 노드로 간다
86 + * @pre Iterator has been initialized.
87 + * @post 이전 노드로 포인터가 이동한다
88 + * @return Return Prev data of the list.
89 + */
90 + T Prev();
91 +
92 +
93 +
94 +};
95 +
96 +
97 +
98 +// 현재 원소가 null인지 검사
99 +template <typename T>
100 +bool DoublyIter<T>::NotNull() {
101 + if (CurPointer == NULL) {
102 + return false;
103 + }
104 + else return true;
105 +}
106 +
107 +// 다음 원소가 null인지 검사
108 +template <typename T>
109 +bool DoublyIter<T>::NextNotNull() {
110 + if (CurPointer->next == NULL) {
111 +
112 + return false;
113 + }
114 + else
115 + return true;
116 +}
117 +
118 +template<typename T>
119 +bool DoublyIter<T>::PrevNotNull()
120 +{
121 + if (CurPointer->Prev == NULL)
122 + return false;
123 + else
124 + return true;
125 +
126 +}
127 +// 첫 번째 node
128 +template <typename T>
129 +T DoublyIter<T>::First() {
130 + if (!m_List.IsEmpty()) {
131 + CurPointer = m_List.m_pFirst;
132 + return CurPointer->data;
133 + }
134 +}
135 +
136 +// 다음 node로 이동 후 item을 return.
137 +template <typename T>
138 +T DoublyIter<T>::Next() {
139 + T output = CurPointer->data;
140 + if (NotNull()) {
141 + CurPointer = CurPointer->next;
142 + }
143 + return output;
144 +}
145 +template<typename T>
146 +T DoublyIter<T>::Last()
147 +{
148 + if (!m_List.IsEmpty()) {
149 + CurPointer = m_List.m_pLast;
150 + return CurPointer -> data;
151 + }
152 +
153 +
154 +}
155 +template<typename T>
156 +T DoublyIter<T>::Prev()
157 +{
158 + T output = CurPointer->data;
159 + if (NotNull()) {
160 + CurPointer = CurPointer->prev;
161 + }
162 + return output;
163 +
164 +
165 +}
166 +// 현재 node를 return
167 +template <typename T>
168 +NodeType<T> DoublyIter<T>::GetCurrentNode() {
169 + if (CurPointer != NULL) {
170 + return *CurPointer;
171 + }
172 +}
173 +template<typename T>
174 +T* DoublyIter<T>::GetCurrentPtr()
175 +{
176 + if (CurPointer != NULL)
177 + {
178 + return &(CurPointer->data);
179 + }
180 +
181 +}
182 +
183 +#endif // !_DOUBLY_ITER_H
...\ No newline at end of file ...\ No newline at end of file
1 +#pragma once
2 +#ifndef _UN_SORTED_LINKED_LIST_H
3 +#define _UN_SORTED_LINKED_LIST_H
4 +#include"UnSortedLinkedList.h"
5 +
6 +
7 +template<typename T>
8 +class UnSortedLinkedList;
9 +
10 +template<typename T>
11 +struct NodeType2;
12 +
13 +
14 +
15 +template<typename T>
16 +class DoublyIter2 {
17 + friend class UnSortedLinkedList<T>;
18 +
19 +private:
20 + const UnSortedLinkedList<T>& m_List;
21 + NodeType2<T>* CurPointer;
22 +public:
23 + DoublyIter2(const UnSortedLinkedList<T>& list) : m_List(list), CurPointer(list.m_pList)
24 + {}
25 + /**
26 + * @brief 현재 노드를 가리키는 포인터가 null인지 아닌지 판단하는 메서드.
27 + * @pre Iterator has been initialized.
28 + * @post None.
29 + * @return nullptr true, otherwise false.
30 + */
31 + bool NotNull();
32 +
33 + /**
34 + * @brief 현재 노드 포인터의 다음 노드가 null인지 아닌지 판단하는 메서드.
35 + * @pre Iterator has been initialized.
36 + * @post None.
37 + * @return nullptr true, otherwise false.
38 + */
39 + bool NextNotNull();
40 + /**
41 + * @brief 현재 노드 포인터의 이전 노드가 null인지 아닌지 판단하는 메서드.
42 + * @pre Iterator has been initialized.
43 + * @post None.
44 + * @return nullptr true, otherwise false.
45 + */
46 + bool PrevNotNull();
47 + /**
48 + * @brief Get first data of the list.
49 + * @pre Iterator has been initialized.
50 + * @post Current pointer is moved to the first node.
51 + * @return Return first data of the list.
52 + */
53 + T First();
54 +
55 + /**
56 + * @brief Get next data of the current pointer.
57 + * @pre Iterator has been initialized.
58 + * @post Current pointer is moved to the next node.
59 + * @return Return next data of the list.
60 + */
61 + T Next();
62 +
63 + /**
64 + * @brief Get current data of the list and go to the next node. 현재 노드. 객체반환은 return by value
65 + * @pre Iterator has been initialized.
66 + * @post Current pointer is moved to next node.
67 + * @return Return current data of the list.
68 + */
69 + NodeType2<T> GetCurrentNode();
70 + /**
71 + * @brief 현재 노드의 data의 주소값을 반환하는 함수
72 + * @pre Iterator has been initialized.
73 + * @post x
74 + * @return Return current data's address
75 + */
76 + T* GetCurrentPtr();
77 + /**
78 + * @brief 마지막 데이터의 포인터를 받는다.
79 + * @pre Iterator has been initialized.
80 + * @post x
81 + * @return Return last data of the list.
82 + */
83 + T Last();
84 + /**
85 + * @brief Curpointer의 이전 노드로 간다
86 + * @pre Iterator has been initialized.
87 + * @post 이전 노드로 포인터가 이동한다
88 + * @return Return Prev data of the list.
89 + */
90 + T Prev();
91 +
92 +
93 +
94 +};
95 +
96 +
97 +
98 +// 현재 원소가 null인지 검사
99 +template <typename T>
100 +bool DoublyIter2<T>::NotNull() {
101 + if (CurPointer == NULL) {
102 + return false;
103 + }
104 + else return true;
105 +}
106 +
107 +// 다음 원소가 null인지 검사
108 +template <typename T>
109 +bool DoublyIter2<T>::NextNotNull() {
110 + if (CurPointer->next == NULL) {
111 +
112 + return false;
113 + }
114 + else
115 + return true;
116 +}
117 +
118 +template<typename T>
119 +bool DoublyIter2<T>::PrevNotNull()
120 +{
121 + if (CurPointer->Prev == NULL)
122 + return false;
123 + else
124 + return true;
125 +
126 +}
127 +// 첫 번째 node
128 +template <typename T>
129 +T DoublyIter2<T>::First() {
130 + if (!m_List.IsEmpty()) {
131 + CurPointer = m_List.m_pFirst;
132 + return CurPointer->data;
133 + }
134 +}
135 +
136 +// 다음 node로 이동 후 item을 return.
137 +template <typename T>
138 +T DoublyIter2<T>::Next() {
139 + T output = CurPointer->data;
140 + if (NotNull()) {
141 + CurPointer = CurPointer->next;
142 + }
143 + return output;
144 +}
145 +template<typename T>
146 +T DoublyIter2<T>::Last()
147 +{
148 + if (!m_List.IsEmpty()) {
149 + CurPointer = m_List.m_pLast;
150 + return CurPointer->data;
151 + }
152 +
153 +
154 +}
155 +template<typename T>
156 +T DoublyIter2<T>::Prev()
157 +{
158 + T output = CurPointer->data;
159 + if (NotNull()) {
160 + CurPointer = CurPointer->pre;
161 + }
162 + return output;
163 +
164 +
165 +}
166 +// 현재 node를 return
167 +template <typename T>
168 +NodeType2<T> DoublyIter2<T>::GetCurrentNode() {
169 + if (CurPointer != NULL) {
170 + return *CurPointer;
171 + }
172 +}
173 +template<typename T>
174 +T* DoublyIter2<T>::GetCurrentPtr()
175 +{
176 + if (CurPointer != NULL)
177 + {
178 + return &(CurPointer->data);
179 + }
180 +
181 +}
182 +
183 +#endif // !_DOUBLY_ITER2_H
...\ No newline at end of file ...\ No newline at end of file
1 +#pragma once
2 +#include<iostream>
3 +#include<string>
4 +#include"SortedLinkedList.h"
5 +#include"SimplifiedType.h"
6 +using namespace std;
7 +/**
8 +* @brief 과제 1에서 이 클래스는 쓰이지 않는다.
9 +
10 +*/
11 +class GenreType //현재 이 장르타입은 쓰지 않는다.
12 +{
13 +public:
14 + GenreType()
15 + {
16 + G_num = -1;
17 + G_name = "";
18 + } //기본 생성자
19 +
20 + ~GenreType()
21 + {
22 +
23 + } //기본 소멸자
24 +
25 + /**
26 + * @brief Get Genre
27 + * @pre Genre is set.
28 + * @post none.
29 + * @return Genre;
30 +*/
31 + string GetGenre()
32 + {
33 + return G_name;
34 + }
35 + /**
36 + * @brief Get song Number
37 + * @pre song Name is set.
38 + * @post none.
39 + * @return song number
40 +*/
41 + int GetNum()
42 + {
43 + return G_num;
44 + }
45 + /**
46 + * @brief set song number
47 + * @pre x
48 + * @post song number is set
49 + * @param num song number
50 +*/
51 + void SetNum(int num)
52 + {
53 + G_num = num;
54 + }
55 + /**
56 + * @brief set genre
57 + * @pre x
58 + * @post genre is set
59 + * @param Genre Genre
60 +*/
61 + void SetGenre(string Genre)
62 + {
63 + G_name = Genre;
64 + }
65 + /**
66 +* @brief 두 SimplifiedType의 Primary key가 같은지 비교함
67 +* @pre 비교하고자 하는 SimplifiedType이 초기화 되어있어야함
68 +* @post x
69 +* @param data 비교하고자 하는 데이터
70 +* @return 같을경우 true, 다를경우 false
71 +*/
72 + bool operator==(GenreType data)
73 + {
74 +
75 + if (this->GetNum() == data.GetNum())
76 + return true;
77 + else
78 + return false;
79 + }
80 + /**
81 +* @brief 두 SimplifiedType의 Primary key의 크기를 비교함
82 +* @pre 비교하고자 하는 SimplifiedType이 초기화 되어있어야함
83 +* @post x
84 +* @param data 비교하고자 하는 데이터
85 +* @return 좌변이 클경우 true 작을경우 false
86 +
87 +*/
88 + bool operator>(GenreType data)
89 + {
90 + if (this->GetNum() > data.GetNum())
91 + return true;
92 + else
93 + return false;
94 + }
95 + /**
96 +* @brief 두 SimplifiedType의 Primary key의 크기를 비교함
97 +* @pre 비교하고자 하는 SimplifiedType이 초기화 되어있어야함
98 +* @post x
99 +* @param data 비교하고자 하는 데이터
100 +* @return 우변이 클경우 true 작을경우 false
101 +*/
102 + bool operator<(GenreType data)
103 + {
104 + if (this->GetNum() < data.GetNum())
105 + return true;
106 + else
107 + return false;
108 +
109 + }
110 + /**
111 +* @brief GenreList안에 Simplified 타입을 넣는 함수
112 +* @pre x
113 +* @post 현재 GenreList에 Simplified 타입이 추가된다
114 +* @param 추가하고자 하는 데이터
115 +*/
116 + void addListinGenre(SimplifiedType in)
117 + {
118 + G_List.Add(in);
119 + }
120 + /**
121 +* @brief 현 GenreList안의 모든 데이터를 출력하는함수
122 +* @pre GenreList안의 원소가 초기화 되어있어야함
123 +* @post x
124 +*/
125 + void PrintAll()
126 + {
127 +
128 +
129 +
130 +
131 + }
132 +
133 +
134 +
135 +
136 +private:
137 + int G_num; //장르 넘버 = Primary Key
138 + string G_name; //장르 명
139 + SortedLinkedList<SimplifiedType> G_List; //각 장르별 장르리스트
140 +};
...\ No newline at end of file ...\ No newline at end of file
1 +#pragma once
2 +#include"MusicType.h"
3 +
4 +
5 +class ManageType {
6 +private:
7 + string Pkey;
8 + int played;
9 + int Index;
10 + string name;
11 + string artist;
12 +public:
13 + ManageType() {
14 + Pkey = "";
15 + played = 0;
16 + Index = 0;
17 + };
18 + ~ManageType() {};
19 + void setPkey(string key)
20 + {
21 + Pkey = key;
22 + }
23 + void setIndex(int I)
24 + {
25 + Index = I;
26 + }
27 + void IncreasePlayed()
28 + {
29 + played++;
30 + }
31 + void setName(string N)
32 + {
33 + name = N;
34 + }
35 + void setArtist(string A)
36 + {
37 + artist = A;
38 + }
39 + string getArtist()
40 + {
41 + return artist;
42 + }
43 + string getPkey()
44 + {
45 + return Pkey;
46 + }
47 + int getPlayed()
48 + {
49 + return played;
50 + }
51 + int getIndex()
52 + {
53 + return Index;
54 + }
55 + string getName()
56 + {
57 + return name;
58 + }
59 +
60 + void PrintNameNArtist()
61 + {
62 + cout << "\t°î¸í : " << name << endl;
63 + cout << "\t¾ÆƼ½ºÆ® : " << artist << endl << endl;
64 + }
65 + void PrintNameNIndex()
66 + {
67 + cout << "\t°î¸í : " << name << endl;
68 + cout << "\tIndex : " << Index << endl << endl;
69 + }
70 +
71 +};
72 +
1 +
2 +#include "MusicType.h"
3 +
4 +
5 +
6 +
7 +// Ǻ
8 +// Set student song Name from keyboard.
9 +void MusicType::SetNameFromKB()
10 +{
11 +
12 + cout << "\tsong Name : ";
13 + cin >> Name;
14 +
15 +}
16 +
17 +
18 +// Set Singer Name from keyboard.
19 +void MusicType::SetSingerFromKB()
20 +{
21 +
22 + cout << "\tSinger : ";
23 + cin >> Singer;
24 +
25 +}
26 +
27 +
28 +// Set Album Name from keyboard.
29 +void MusicType::SetAlbumFromKB()
30 +{
31 +
32 + cout << "\tAlbum : ";
33 + cin >> Album;
34 +
35 +}
36 +// Set Genre from keyboard
37 +void MusicType::SetGenreFromKB()
38 +{
39 +
40 + cout << "\tGenre : ";
41 + cin >> Genre;
42 +
43 +
44 +}
45 +
46 +// Set Lyrics from keyboard
47 +void MusicType::SetLyricsFromKB()
48 +{
49 + cin.ignore();
50 + cout << "\tLyrics : ";
51 + getline(cin, Lyrics);
52 +}
53 +void MusicType::SetNumFromKB()
54 +{
55 + cout << "\tNumber : ";
56 + cin >> Num;
57 +}
58 +
59 +
60 +// Set student record from keyboard.
61 +void MusicType::SetInfoFromKB()
62 +{
63 + //SetNumFromKB();
64 + SetNameFromKB();
65 + SetSingerFromKB();
66 + SetAlbumFromKB();
67 + SetGenreFromKB();
68 + SetLyricsFromKB();
69 + SetPkey();
70 +}
71 +
72 +
73 +// Read a record from file.
74 +int MusicType::ReadDataFromFile(ifstream& fin)
75 +{
76 + fin >> Name;
77 + fin >> Singer;
78 + fin >> Album;
79 + fin >> Genre;
80 + getline(fin, Lyrics);
81 + return 1;
82 +};
83 +
84 +
85 +// Write a record into file.
86 +int MusicType::WriteDataToFile(ofstream& fout)
87 +{
88 + fout << endl;
89 + fout << Name << " ";
90 + fout << Singer << " ";
91 + fout << Album << " ";
92 + fout << Lyrics << " ";
93 +
94 + return 1;
95 +}
...\ No newline at end of file ...\ No newline at end of file
1 +
2 +#ifndef _MusicType_H
3 +#define _MusicType_H
4 +
5 +#include <iostream>
6 +#include <fstream>
7 +#include <string>
8 +
9 +using namespace std;
10 +
11 +
12 +
13 +
14 +/**
15 +* item information class.
16 +*/
17 +class MusicType
18 +{
19 +public:
20 + /**
21 + * default constructor.
22 + */
23 + MusicType()
24 + {
25 + Num = -1;
26 + Name = "";
27 + Singer = "";
28 + Album = "";
29 + Genre = "";
30 + Lyrics = "";
31 + }
32 +
33 + /**
34 + * destructor.
35 + */
36 + ~MusicType() {}
37 + /**
38 + * @brief Get song Name
39 + * @pre song Name is set.
40 + * @post none.
41 + * @return song Name;
42 +*/
43 + int GetNum()
44 + {
45 + return Num;
46 + }
47 + /**
48 + * @brief Get song Name
49 + * @pre song Name is set.
50 + * @post none.
51 + * @return song Name;
52 + */
53 + string GetName()
54 + {
55 + return Name;
56 + }
57 +
58 + /**
59 + * @brief Get Singer Name.
60 + * @pre Singer Name is set.
61 + * @post none.
62 + * @return Singer Name.
63 + */
64 + string GetSinger()
65 + {
66 + return Singer;
67 + }
68 +
69 + /**
70 + * @brief Get Album Name
71 + * @pre Album Name is set.
72 + * @post none.
73 + * @return Album Name.
74 + */
75 + string GetAlbum()
76 + {
77 + return Album;
78 + }
79 + /**
80 + * @brief Get Genre
81 + * @pre Genre is set.
82 + * @post none.
83 + * @return Genre.
84 + */
85 + string GetGenre()
86 + {
87 + return Genre;
88 + }
89 + /**
90 + * @brief Get Lyrics
91 + * @pre Lyrics is set.
92 + * @post none.
93 + * @return Lyrics.
94 + */
95 + string GetLyrics()
96 + {
97 + return Lyrics;
98 + }
99 + /**
100 + * @brief Get Pkey
101 + * @pre Pkey is set.
102 + * @post none.
103 + * @return Pkey
104 + */
105 + string GetPkey()
106 + {
107 + return Pkey;
108 + }
109 + /**
110 + * @brief Set song Name
111 + * @pre none.
112 + * @post song Name is set.
113 + * @param s_Name song Name
114 + */
115 + void SetName(string s_Name)
116 + {
117 + Name = s_Name;
118 + }
119 + /**
120 +* @brief Set song Name
121 +* @pre none.
122 +* @post song Name is set.
123 +* @param s_Name song Name
124 +*/
125 + void SetNum(int s_Num)
126 + {
127 + Num = s_Num;
128 + }
129 + /**
130 + * @brief Set Singer Name
131 + * @pre none.
132 + * @post Singer Name is set.
133 + * @param s_Singer Singer Name.
134 + */
135 + void SetSinger(string s_Singer)
136 + {
137 + Singer = s_Singer;
138 + }
139 +
140 + /**
141 + * @brief Set Album Name
142 + * @pre none.
143 + * @post Album Name is set.
144 + * @param s_Album Album Name.
145 + */
146 + void SetAlbum(string s_Album)
147 + {
148 + Album = s_Album;
149 + }
150 + /**
151 + * @brief Set Genre
152 + * @pre none.
153 + * @post Genre is set.
154 + * @param s_Genre Genre.
155 + */
156 + void SetGenre(string s_Genre)
157 + {
158 + Genre = s_Genre;
159 + }
160 + /**
161 + * @brief Set Lyrics
162 + * @pre none.
163 + * @post Lyrics is set.
164 + * @param s_Lyrics Lyrics
165 + */
166 + void SetLyrics(string s_Lyrics)
167 + {
168 + Lyrics = s_Lyrics;
169 + }
170 + /**
171 + * @brief Set Pkey
172 + * @pre none.
173 + * @post Pkey is set.
174 + */
175 + void SetPkey()
176 + {
177 + Pkey = Name + Singer;
178 + }
179 + /**
180 + * @brief Set song information
181 + * @pre none.
182 + * @post song information is set
183 + * @param s_Name song Name
184 + * @param s_Singer Singer Name
185 + * @param s_Album Album Name.
186 + * @param s_Genre Genre
187 + * @param s_Lyrics Lyrics;
188 + */
189 + void SetRecord(string s_Name, string s_Singer, string s_Album, string s_Genre, string s_Lyrics)
190 + {
191 + SetName(s_Name);
192 + SetSinger(s_Singer);
193 + SetAlbum(s_Album);
194 + SetGenre(s_Genre);
195 + SetLyrics(s_Lyrics);
196 + SetPkey();
197 + }
198 + /**
199 + * @brief Display song Name on screen.
200 + * @pre song Name is set.
201 + * @post song Name is on screen.
202 + */
203 + void DisplayNumOnScreen()
204 + {
205 + cout << "\tSong Number(Track Number) : " << Num << endl;
206 + };
207 + /**
208 + * @brief Display song Name on screen.
209 + * @pre song Name is set.
210 + * @post song Name is on screen.
211 + */
212 + void DisplayNameOnScreen()
213 + {
214 + cout << "\tSong Name : " << Name << endl;
215 + };
216 +
217 + /**
218 + * @brief Display Singer Name on screen.
219 + * @pre Singer Name is set.
220 + * @post Singer Name is on screen.
221 + */
222 + void DisplaySingerOnScreen()
223 + {
224 + cout << "\tSinger : " << Singer << endl;
225 + };
226 +
227 + /**
228 + * @brief Display Album Name on screen.
229 + * @pre Album Name is set.
230 + * @post Album Name is on screen.
231 + */
232 + void DisplayAlbumOnScreen()
233 + {
234 + cout << "\tAlbum : " << Album << endl;
235 + };
236 +
237 + /**
238 + * @brief Display Genre on screen.
239 + * @pre Genre is set.
240 + * @post Genre is on screen.
241 + */
242 + void DisplayGenreOnScreen()
243 + {
244 + cout << "\tGenre : " << Genre << endl;
245 + };
246 + /**
247 +* @brief Display Lyrics on screen.
248 +* @pre Lyrics is set.
249 +* @post Lyrics is on screen.
250 +*/
251 + void DisplayLyricsOnScreen()
252 + {
253 + cout << "\tLyrics : " << Lyrics << endl;
254 + };
255 + /**
256 + * @brief Display an song information on screen.
257 + * @pre song information is set.
258 + * @post song information is on screen.
259 + */
260 + void DisplayRecordOnScreen()
261 + {
262 + DisplayNumOnScreen();
263 + DisplayNameOnScreen();
264 + DisplaySingerOnScreen();
265 + DisplayAlbumOnScreen();
266 + DisplayGenreOnScreen();
267 + DisplayLyricsOnScreen();
268 + };
269 + /**
270 + * @brief Set song Number from keyboard.
271 + * @pre none.
272 + * @post song Number is set.
273 + */
274 + void SetNumFromKB();
275 + /**
276 + * @brief Set song Name from keyboard.
277 + * @pre none.
278 + * @post song Name is set.
279 + */
280 + void SetNameFromKB();
281 +
282 + /**
283 + * @brief Set Singer Name from keyboard.
284 + * @pre none.
285 + * @post Singer Name is set.
286 + */
287 + void SetSingerFromKB();
288 +
289 + /**
290 + * @brief Set Album Name from keyboard.
291 + * @pre none.
292 + * @post Album Name is set.
293 + */
294 + void SetAlbumFromKB();
295 + /**
296 + * @brief Set Genre from keyboard.
297 + * @pre none.
298 + * @post Genre is set.
299 + */
300 + void SetGenreFromKB();
301 + /**
302 + * @brief Set Lyrics from keyboard.
303 + * @pre none.
304 + * @post Lyrics is set.
305 + */
306 + void SetLyricsFromKB();
307 + /**
308 + * @brief Set song information from keyboard.
309 + * @pre none.
310 + * @post song information is set.
311 + */
312 + void SetInfoFromKB();
313 +
314 + /**
315 + * @brief Read a record from file.
316 + * @pre the target file is opened.
317 + * @post student record is set.
318 + * @param fin file descriptor.
319 + * @return return 1 if this function works well, otherwise 0.
320 + */
321 + int ReadDataFromFile(ifstream& fin);
322 +
323 + /**
324 + * @brief Write a record into file.
325 + * @pre the target file is opened. And the list should be initialized.
326 + * @post the target file is included the new student record.
327 + * @param fout file descriptor.
328 + * @return return 1 if this function works well, otherwise 0.
329 + */
330 + int WriteDataToFile(ofstream& fout);
331 +
332 + /**
333 +* @brief 두 MusicType의 Primary key가 같은지 비교함
334 +* @pre 비교하고자 하는 MusicType이 초기화 되어있어야함
335 +* @post x
336 +* @param data 비교하고자 하는 데이터
337 +* @return 같을경우 true, 다를경우 false
338 +*/
339 + bool operator==(MusicType data)
340 + {
341 +
342 + if (this->GetPkey() == data.GetPkey())
343 + return true;
344 + else
345 + return false;
346 + }
347 + /**
348 +* @brief 두 MusicType의 Primary key의 크기를 비교함
349 +* @pre 비교하고자 하는 MusicType이 초기화 되어있어야함
350 +* @post x
351 +* @param data 비교하고자 하는 데이터
352 +* @return 좌변이 클경우 true 작을경우 false
353 +
354 +*/
355 + bool operator>(MusicType data)
356 + {
357 + return (this->GetPkey() > data.GetPkey());
358 + }
359 + /**
360 +* @brief 두 MusicType의 Primary key의 크기를 비교함
361 +* @pre 비교하고자 하는 MusicType이 초기화 되어있어야함
362 +* @post x
363 +* @param data 비교하고자 하는 데이터
364 +* @return 우변이 클경우 true 작을경우 false
365 +*/
366 + bool operator<(MusicType data)
367 + {
368 + return (this->GetPkey() < data.GetPkey());
369 +
370 + }
371 +
372 +
373 +protected:
374 + int Num; //곡의 인덱스
375 + string Name; //곡명
376 + string Singer; //가수
377 + string Album; //앨범
378 + string Genre; //장르
379 + string Lyrics; //가사
380 + string Pkey; //Primary Key
381 +};
382 +
383 +
384 +
385 +
386 +#endif // _MusicType_H
1 +
2 +#include "PLType.h"
3 +
4 +PLType::PLType(const PLType& data)
5 +{
6 + PlayList = data.PlayList;
7 + PLname = data.PLname;
8 + length = data.length;
9 +
10 +}
11 +void PLType::Printall()
12 +{
13 + DoublyIter2<ManageType*> Mgiter(PlayList);
14 + while (Mgiter.NotNull())
15 + {
16 + cout << " : " << Mgiter.GetCurrentNode().data->getName() << endl;
17 + cout << "Index : " << Mgiter.GetCurrentNode().data->getIndex() << endl;
18 + Mgiter.Next();
19 + }
20 +
21 +}
...\ No newline at end of file ...\ No newline at end of file
1 +#pragma once
2 +#include"ManageType.h"
3 +#include"UnSortedLinkedList.h"
4 +class PLType {
5 +private:
6 +
7 + UnSortedLinkedList<ManageType*> PlayList;
8 + string PLname;
9 + int length;
10 +public:
11 + PLType() { length = 0; PLname = ""; }
12 + ~PLType() {}
13 + PLType(const PLType& data);
14 + void setPLname(string N)
15 + {
16 + PLname = N;
17 + }
18 + string getPLname()
19 + {
20 + return PLname;
21 + }
22 + void AddListinList(ManageType* data)
23 + {
24 + PlayList.Add(data);
25 + length++;
26 + }
27 + void Printall();
28 +};
1 +#pragma once
2 +#ifndef _DOUBLY_ITER_H
3 +#define _DOUBLY_ITER_H
4 +#include"DoublyIter.h"
5 +
6 +template <typename T>
7 +struct NodeType {
8 + T data; //각 노드의 데이터
9 + NodeType* next;// 노드의 다음을 가리킬 포인터
10 + NodeType* pre;
11 +};
12 +template<typename T>
13 +class DoublyIter;
14 +/*
15 +* @bried 이 클래스는 더블소티드링크드리스트
16 +*/
17 +template<typename T>
18 +class SortedLinkedList
19 +{
20 + friend class DoublyIter<T>;
21 +public:
22 + /**
23 +* default constructor.
24 +*/
25 + SortedLinkedList();
26 +
27 + /**
28 + * destructor.
29 + */
30 + ~SortedLinkedList();
31 + /**
32 + * @brief 깊은 복사를 위한 SortedLinkedList의 복사 연산자
33 + * @pre anotherList가 초기화되어 있어야한다.
34 + * @post anotherList와 같은 정보를 가진 리스트가 생성된다
35 + * @param anotherList 복사하고자 하는 SortedLinkedList
36 + */
37 + SortedLinkedList(const SortedLinkedList<T>& anotherList);
38 + /**
39 + * @brief 링크드 리스트의 모든 노드를 제거한다.
40 + * @pre None.
41 + * @post 리스트가 비워진다.
42 +
43 + */
44 + void MakeEmpty();
45 +
46 + /**
47 + * @brief 리스트의 길이 = 원소의 개수 를 리턴함
48 + * @pre x
49 + * @post 리턴값이 리스트의 길이가 된다
50 + * @return 리스트의 길이 = 원소의 개수
51 + */
52 + int GetLength()
53 + {
54 + return m_nLength;
55 + }
56 + /**
57 + * @brief 새로운 노드의 값을 비교하여 맞는 위치에 추가한다
58 + * @pre List is not Full(메모리에 빈 공간이 있어야 한다)
59 + * @post 리스트에 아이템이 추가된다.
60 + * @return 추가되면 1 아니면 0
61 + * @param 추가하고자 하는 데이터값
62 + */
63 + int Add(T& data);
64 + /**
65 + * @brief 입력한 정보와 같은 정보를 가진 리스트의 원소를 리스트에서 삭제한다
66 + * @pre 리스트가 비어있지 않아야한다.
67 + * @post 리스트의 원소가 삭제되고 길이가 짧아진다.
68 + * @return 삭제됬으면 1 아니면 0
69 + * @param data 삭제하고자 하는 데이터값
70 + */
71 + int Delete(T& data);
72 + /**
73 + * @brief 리스트내의 정보를 바꾼다
74 + * @pre 리스트에 하나이상의 원소가 있어야한다.
75 + * @post 리스트내의 원소의 정보가 바뀐다
76 + * @return 작동했으면 1 아니면 0
77 + */
78 + int Replace(T& data);
79 + /**
80 + * @brief 리스트에서 Primarykey를 기준으로 일치하는 원소를 받아온다
81 + * @pre 리스트내의 정보가 초기화되있어야 한다
82 + * @post 키와 맞는 정보가 있으면 그것을 받아온다..
83 + * @return 찾아왔으면 1, 못찾았으면 0
84 + */
85 + int Get(T& item);
86 + /**
87 + * @brief 리스트가 비어있는지를 확인한다.
88 + * @pre x
89 + * @post x
90 + * @return 비었으면 1, 아니면 0
91 + */
92 + bool IsEmpty()
93 + {
94 + if (m_nLength == 0)
95 + return true;
96 + else
97 + return false;
98 + }
99 +
100 + /**
101 + * @brief 복사 생성자를 이용한 대입 연산자
102 + * @pre anotherList가 정의되어 있어야한다.
103 + * @post 깊은 복사된 리스트가 대입된다.
104 + * @return 복사된 리스트
105 + */
106 + SortedLinkedList<T> operator=(const SortedLinkedList<T> &anotherList);
107 +
108 +private:
109 + NodeType<T> *m_pList;
110 + NodeType<T> *m_pLast;
111 + int m_nLength;
112 +};
113 +
114 +
115 +
116 +//함수 정의부
117 +template<typename T>
118 +SortedLinkedList<T>::SortedLinkedList()
119 +{
120 + m_nLength = 0;
121 + m_pList = NULL;
122 +
123 +
124 +}
125 +template<typename T>
126 +SortedLinkedList<T>::~SortedLinkedList()
127 +{
128 + MakeEmpty();//메모리누수를 막기위해 노드의 데이터를 모두 제거한다
129 +
130 +}
131 +template<typename T>
132 +void SortedLinkedList<T>::MakeEmpty()
133 +{
134 + NodeType<T> *tempptr;
135 + DoublyIter<T> iter(*this);
136 + while (iter.NotNull())
137 + {
138 + tempptr = iter.CurPointer;
139 + iter.Next();
140 + delete tempptr;
141 + } //리스트내의 모든 노드를 제거
142 +
143 + m_pList = NULL;
144 + m_pLast = NULL;
145 + m_nLength = 0;
146 +
147 +}
148 +
149 +template<typename T>
150 +int SortedLinkedList<T>::Add(T &data)
151 +{
152 +
153 +
154 +
155 + NodeType<T> *Node = new NodeType<T>;
156 + NodeType<T> *Pre;
157 + DoublyIter<T> iter(*this);
158 + bool Found = false;
159 + T dummy;
160 +
161 +
162 + Node->data = data;
163 + Node->next = NULL;
164 + Node->pre = NULL;
165 + if (IsEmpty()) //비어있을 경우
166 + {
167 + m_pList = Node;
168 + m_pLast = m_pList;
169 + m_nLength++; //성공적으로 추가했으므로 길이를 늘려준다
170 + }
171 + //list에 노드가 있을경우
172 + else
173 + {
174 + while (1)
175 + {
176 +
177 + //Pre = m_pCurPointer; //이전 노드를 가리키는 포인터 갱신, 첫 시작은 m_pList로 리스트의 첫부분이다
178 +
179 +
180 + if (iter.CurPointer->data == Node->data)
181 + break; //같은 데이터가 있을경우 추가하지 않고 반복문을 탈출한다..
182 +
183 + if (iter.CurPointer->data > Node->data) //Node의 데이터가 현재 포인터의 값보다 작아질때까지 node가 들어갈 위치를 뒤로 민다.
184 + {
185 + if (iter.CurPointer->pre == NULL) //리스트 맨 앞 장소에 넣어야 할때 첫번째 원소로 삽입한다
186 + {
187 +
188 + Node->next = iter.CurPointer;
189 + iter.CurPointer->pre = Node;
190 + m_pList = Node;
191 + m_nLength++; //성공적으로 추가했으므로 break 하기전에 길이를 늘려준다
192 +
193 + break;
194 + }
195 + Node->next = iter.CurPointer;
196 + Node->pre = iter.CurPointer->pre;
197 + iter.CurPointer->pre->next = Node;
198 + iter.CurPointer->pre = Node;
199 + m_nLength++; //성공적으로 추가했으므로 break 하기전 길이를 늘려준다.
200 + break;
201 +
202 +
203 + }
204 +
205 + //Node 포인터가 마지막 노드를 가리키면 그 뒤에 Node를 삽입한다.
206 + if (iter.CurPointer->next == NULL)
207 + {
208 + Node->pre = iter.CurPointer;
209 + iter.CurPointer->next = Node;
210 +
211 + m_pLast = Node;
212 + m_nLength++;
213 + break;
214 +
215 + }
216 + iter.Next();
217 +
218 +
219 + }
220 +
221 +
222 +
223 +
224 + }
225 +
226 +
227 + return 1;
228 +}
229 +
230 +template<typename T>
231 +int SortedLinkedList<T>::Delete(T& data)
232 +{
233 + bool MoreToSearch, found;
234 + NodeType<T> *Pre = NULL;
235 + DoublyIter<T> iter(*this);
236 +
237 + found = false;
238 + MoreToSearch = iter.NotNull();
239 +
240 + while (MoreToSearch && !found)
241 + {
242 + if (data == iter.CurPointer->data) //현재 가리키는 원소가 패러미터로 넣은 값과 같은가?
243 + {
244 + found = true; //찾았으므로 found = true
245 + if (Pre == NULL) //찾은 항목이 첫번째 원소일경우
246 + {
247 + NodeType<T>* temp = iter.CurPointer; //첫번째 원소의 다음원소를 저장할 임시 포인터선언
248 + delete m_pList; //첫원소를 삭제한다.
249 + temp->pre = NULL;
250 + m_pList = temp; //찾은 항목이 첫 항목일경우 다음 원소를 첫번째 원소로 한다.
251 +
252 + }
253 + else
254 + {
255 +
256 + Pre->next = iter.CurPointer->next;
257 + iter.CurPointer->next->pre = Pre;
258 + delete iter.CurPointer;
259 + }
260 +
261 +
262 +
263 + }
264 + else
265 + {
266 + Pre = iter.CurPointer;
267 + iter.Next();
268 + MoreToSearch = (iter.NotNull());
269 +
270 + } //못 찾을경우 m_CurPointer은 다음 원소를 가리킨다. 단 Pre는 현재원소를 가리킨다.
271 + }
272 +
273 + if (found) //찾았을 경우
274 + {
275 + m_nLength--;
276 + return 1;
277 +
278 + }
279 + else //못 찾으면
280 + return 0;
281 +
282 +
283 +
284 +}
285 +
286 +template<typename T>
287 +int SortedLinkedList<T>::Replace(T& data)
288 +{
289 + bool MoreToSearch, found;
290 + NodeType<T> *location;
291 +
292 + location = m_pList;
293 + found = false;
294 + MoreToSearch = (location != NULL);
295 +
296 + while (MoreToSearch && !found) //리스트의 끝이 아니면서 아직 몾찾을경우 반복한다
297 + {
298 + if (data == location->data) //일치하는 경우를 찾으면
299 + {
300 + found = true;
301 + location->data = data;
302 + } //찾았으므로 found 는 true가되고 해당위치에 data값을 넣는다
303 + else
304 + {
305 + location = location->next;
306 + MoreToSearch = (location != NULL); //리스트의 끝이 아닐경우 계속찾는다.
307 +
308 + } //찾지 못했을 때 다음 location으로 옮긴다.
309 +
310 + }
311 +
312 + if (found) //찾았을 경우
313 + {
314 + return 1;
315 +
316 + }
317 + else
318 + return 0; //못 찾음
319 +
320 +}
321 +
322 +template<typename T>
323 +int SortedLinkedList<T>::Get(T& data)
324 +{
325 + bool MoreToSearch, found;
326 + NodeType<T>* location;
327 +
328 + location = m_pList;
329 + found = false;
330 + MoreToSearch = (location != NULL);
331 +
332 + while (MoreToSearch && !found)
333 + {
334 + if (data == location->data) //일치하는 항목을 찾으면
335 + {
336 + found = true;
337 + data = location->data;
338 + }
339 + else
340 + {
341 +
342 + location = location->next; //못찾으면 다음위치로 민다
343 + MoreToSearch = (location != NULL); //다음위치가 마지막이 아닐경우 계속 찾는다.
344 + }
345 +
346 + }
347 + if (found) //찾았으면
348 + return 1;
349 + else //못 찾았으면
350 + {
351 + return 0;
352 + }
353 +
354 +
355 +
356 +}
357 +
358 +
359 +
360 +
361 +
362 +
363 +
364 +
365 +
366 +
367 +template<typename T>
368 +SortedLinkedList<T>::SortedLinkedList(const SortedLinkedList<T>& anotherList)
369 +{
370 + NodeType<T> *m_pCurPointer;
371 + m_pList = NULL;
372 + m_pCurPointer = NULL;
373 + if (anotherList.m_pList == NULL)
374 + return;
375 + else {
376 + this->m_nLength = anotherList.m_nLength;
377 +
378 + NodeType<T> *Node1 = new NodeType<T>;
379 + NodeType<T> *preNode;
380 + NodeType<T> *Node2;
381 + m_pList = Node1;
382 + Node1->data = anotherList.m_pList->data;
383 + Node1->pre = NULL;
384 + Node2 = anotherList.m_pList->next;
385 +
386 + while (Node2 != NULL)
387 + {
388 + Node1->next = new NodeType<T>;
389 + preNode = Node1;
390 + Node1 = Node1->next;
391 + Node1->data = Node2->data;
392 + Node1->pre = preNode;
393 + Node2 = Node2->next;
394 +
395 +
396 + }
397 + Node1->next = NULL;
398 +
399 + }
400 +
401 +
402 +}
403 +
404 +template<typename T>
405 +SortedLinkedList<T> SortedLinkedList<T>::operator=(const SortedLinkedList<T> &anotherList)
406 +{
407 + MakeEmpty();
408 + SortedLinkedList<T> temp(anotherList);
409 +
410 + return temp;
411 +
412 +}
413 +
414 +
415 +#endif // !_SORTED_LINKED_LIST_H
...\ No newline at end of file ...\ No newline at end of file
1 +#pragma once
2 +#ifndef _DOUBLY_ITER2_H
3 +#define _DOUBLY_ITER2_H
4 +#include"DoublyIter2.h"
5 +
6 +template <typename T>
7 +struct NodeType2 {
8 + T data; //각 노드의 데이터
9 + NodeType2* next;// 노드의 다음을 가리킬 포인터
10 + NodeType2* pre;
11 +};
12 +template<typename T>
13 +class DoublyIter2;
14 +/*
15 +* @bried 이 클래스는 더블소티드링크드리스트
16 +*/
17 +template<typename T>
18 +class UnSortedLinkedList
19 +{
20 + friend class DoublyIter2<T>;
21 +public:
22 + /**
23 +* default constructor.
24 +*/
25 + UnSortedLinkedList();
26 +
27 + /**
28 + * destructor.
29 + */
30 + ~UnSortedLinkedList();
31 + /**
32 + * @brief 깊은 복사를 위한 UnSortedLinkedList의 복사 연산자
33 + * @pre anotherList가 초기화되어 있어야한다.
34 + * @post anotherList와 같은 정보를 가진 리스트가 생성된다
35 + * @param anotherList 복사하고자 하는 UnSortedLinkedList
36 + */
37 + UnSortedLinkedList(const UnSortedLinkedList<T>& anotherList);
38 + /**
39 + * @brief 링크드 리스트의 모든 노드를 제거한다.
40 + * @pre None.
41 + * @post 리스트가 비워진다.
42 +
43 + */
44 + void MakeEmpty();
45 +
46 + /**
47 + * @brief 리스트의 길이 = 원소의 개수 를 리턴함
48 + * @pre x
49 + * @post 리턴값이 리스트의 길이가 된다
50 + * @return 리스트의 길이 = 원소의 개수
51 + */
52 + int GetLength()
53 + {
54 + return m_nLength;
55 + }
56 + /**
57 + * @brief 새로운 노드의 값을 비교하여 맞는 위치에 추가한다
58 + * @pre List is not Full(메모리에 빈 공간이 있어야 한다)
59 + * @post 리스트에 아이템이 추가된다.
60 + * @return 추가되면 1 아니면 0
61 + * @param 추가하고자 하는 데이터값
62 + */
63 + int Add(T& data);
64 + /**
65 + * @brief 입력한 정보와 같은 정보를 가진 리스트의 원소를 리스트에서 삭제한다
66 + * @pre 리스트가 비어있지 않아야한다.
67 + * @post 리스트의 원소가 삭제되고 길이가 짧아진다.
68 + * @return 삭제瑛만 1 아니면 0
69 + * @param data 삭제하고자 하는 데이터값
70 + */
71 + int Delete(T& data);
72 + /**
73 + * @brief 리스트내의 정보를 바꾼다
74 + * @pre 리스트에 하나이상의 원소가 있어야한다.
75 + * @post 리스트내의 원소의 정보가 바뀐다
76 + * @return 작동했으면 1 아니면 0
77 + */
78 + int Replace(T& data);
79 + /**
80 + * @brief 리스트에서 Primarykey를 기준으로 일치하는 원소를 받아온다
81 + * @pre 리스트내의 정보가 초기화되있어야 한다
82 + * @post 키와 맞는 정보가 있으면 그것을 받아온다..
83 + * @return 찾아왔으면 1, 못찾았으면 0
84 + */
85 + int Get(T& item);
86 + /**
87 + * @brief 리스트가 비어있는지를 확인한다.
88 + * @pre x
89 + * @post x
90 + * @return 비었으면 1, 아니면 0
91 + */
92 + bool IsEmpty() const
93 + {
94 + if (m_nLength == 0)
95 + return true;
96 + else
97 + return false;
98 + }
99 +
100 + /**
101 + * @brief 복사 생성자를 이용한 대입 연산자
102 + * @pre anotherList가 정의되어 있어야한다.
103 + * @post 깊은 복사된 리스트가 대입된다.
104 + * @return 복사된 리스트
105 + */
106 + UnSortedLinkedList<T> operator=(const UnSortedLinkedList<T> &anotherList);
107 +
108 +private:
109 + NodeType2<T> *m_pList;
110 + NodeType2<T> *m_pLast;
111 + int m_nLength;
112 +};
113 +
114 +
115 +
116 +//함수 정의부
117 +template<typename T>
118 +UnSortedLinkedList<T>::UnSortedLinkedList()
119 +{
120 + m_nLength = 0;
121 + m_pList = NULL;
122 +
123 +
124 +}
125 +template<typename T>
126 +UnSortedLinkedList<T>::~UnSortedLinkedList()
127 +{
128 + MakeEmpty();//메모리누수를 막기위해 노드의 데이터를 모두 제거한다
129 +
130 +}
131 +template<typename T>
132 +void UnSortedLinkedList<T>::MakeEmpty()
133 +{
134 + NodeType2<T> *tempptr;
135 + DoublyIter2<T> iter(*this);
136 + while (iter.NotNull())
137 + {
138 + tempptr = iter.CurPointer;
139 + iter.Next();
140 + delete tempptr;
141 + } //리스트내의 모든 노드를 제거
142 + m_pList = NULL;
143 + m_pLast = NULL;
144 + m_nLength = 0;
145 +}
146 +
147 +template<typename T>
148 +int UnSortedLinkedList<T>::Add(T &data)
149 +{
150 +
151 +
152 +
153 + NodeType2<T> *Node = new NodeType2<T>;
154 + NodeType2<T> *Pre;
155 + DoublyIter2<T> iter(*this);
156 + bool Found = false;
157 + T dummy;
158 +
159 +
160 + Node->data = data;
161 + Node->next = NULL;
162 + Node->pre = NULL;
163 + if (IsEmpty()) //비어있을 경우
164 + {
165 + m_pList = Node;
166 + m_pLast = m_pList;
167 + m_nLength++; //성공적으로 추가했으므로 길이를 늘려준다
168 + }
169 + //list에 노드가 있을경우
170 + else
171 + {
172 + while (1)
173 + {
174 +
175 + //Pre = m_pCurPointer; //이전 노드를 가리키는 포인터 갱신, 첫 시작은 m_pList로 리스트의 첫부분이다
176 + Pre = iter.CurPointer;
177 +
178 +
179 +
180 + //Node 포인터가 마지막 노드를 가리키면 그 뒤에 Node를 삽입한다.
181 + if (iter.CurPointer->next == NULL)
182 + {
183 + iter.CurPointer->next = Node;
184 + Node->pre = iter.CurPointer;
185 + m_pLast = Node;
186 + m_nLength++;
187 + break;
188 +
189 + }
190 + iter.Next();
191 +
192 +
193 + }
194 +
195 +
196 +
197 +
198 + }
199 +
200 +
201 + return 1;
202 +}
203 +
204 +template<typename T>
205 +int UnSortedLinkedList<T>::Delete(T& data)
206 +{
207 + bool MoreToSearch, found;
208 + NodeType2<T> *Pre = NULL;
209 + DoublyIter2<T> iter(*this);
210 +
211 + found = false;
212 + MoreToSearch = iter.NotNull();
213 +
214 + while (MoreToSearch && !found)
215 + {
216 + if (data == iter.CurPointer->data) //현재 가리키는 원소가 패러미터로 넣은 값과 같은가?
217 + {
218 + found = true; //찾았으므로 found = true
219 + if (Pre == NULL) //찾은 항목이 첫번째 원소일경우
220 + {
221 + NodeType2<T>* temp = iter.CurPointer; //첫번째 원소의 다음원소를 저장할 임시 포인터선언
222 + delete m_pList; //첫원소를 삭제한다.
223 + temp->pre = NULL;
224 + m_pList = temp; //찾은 항목이 첫 항목일경우 다음 원소를 첫번째 원소로 한다.
225 +
226 + }
227 + else
228 + {
229 +
230 + Pre->next = iter.CurPointer->next;
231 + iter.CurPointer->next->pre = Pre;
232 + delete iter.CurPointer;
233 + }
234 +
235 +
236 +
237 + }
238 + else
239 + {
240 + Pre = iter.CurPointer;
241 + iter.Next();
242 + MoreToSearch = (iter.NotNull());
243 +
244 + } //못 찾을경우 m_CurPointer은 다음 원소를 가리킨다. 단 Pre는 현재원소를 가리킨다.
245 + }
246 +
247 + if (found) //찾았을 경우
248 + {
249 + m_nLength--;
250 + return 1;
251 +
252 + }
253 + else //못 찾으면
254 + return 0;
255 +
256 +
257 +
258 +}
259 +
260 +template<typename T>
261 +int UnSortedLinkedList<T>::Replace(T& data)
262 +{
263 + bool MoreToSearch, found;
264 + NodeType2<T> *location;
265 +
266 + location = m_pList;
267 + found = false;
268 + MoreToSearch = (location != NULL);
269 +
270 + while (MoreToSearch && !found) //리스트의 끝이 아니면서 아직 ▣@뺐嚥 반복한다
271 + {
272 + if (data == location->data) //일치하는 경우를 찾으면
273 + {
274 + found = true;
275 + location->data = data;
276 + } //찾았으므로 found 는 true가되고 해당위치에 data값을 넣는다
277 + else
278 + {
279 + location = location->next;
280 + MoreToSearch = (location != NULL); //리스트의 끝이 아닐경우 계속찾는다.
281 +
282 + } //찾지 못했을 때 다음 location으로 옮긴다.
283 +
284 + }
285 +
286 + if (found) //찾았을 경우
287 + {
288 + return 1;
289 +
290 + }
291 + else
292 + return 0; //못 찾음
293 +
294 +}
295 +
296 +template<typename T>
297 +int UnSortedLinkedList<T>::Get(T& data)
298 +{
299 + bool MoreToSearch, found;
300 + NodeType2<T>* location;
301 +
302 + location = m_pList;
303 + found = false;
304 + MoreToSearch = (location != NULL);
305 +
306 + while (MoreToSearch && !found)
307 + {
308 + if (data == location->data) //일치하는 항목을 찾으면
309 + {
310 + found = true;
311 + data = location->data;
312 + }
313 + else
314 + {
315 +
316 + location = location->next; //못찾으면 다음위치로 민다
317 + MoreToSearch = (location != NULL); //다음위치가 마지막이 아닐경우 계속 찾는다.
318 + }
319 +
320 + }
321 + if (found) //찾았으면
322 + return 1;
323 + else //못 찾았으면
324 + {
325 + return 0;
326 + }
327 +
328 +
329 +
330 +}
331 +
332 +
333 +
334 +
335 +
336 +
337 +
338 +
339 +
340 +
341 +template<typename T>
342 +UnSortedLinkedList<T>::UnSortedLinkedList(const UnSortedLinkedList<T>& anotherList)
343 +{
344 + NodeType2<T> *m_pCurPointer;
345 + m_pList = NULL;
346 + m_pCurPointer = NULL;
347 + if (anotherList.m_pList == NULL)
348 + return;
349 + else {
350 + this->m_nLength = anotherList.m_nLength;
351 +
352 + NodeType2<T> *Node1 = new NodeType2<T>;
353 + NodeType2<T> *preNode;
354 + NodeType2<T> *Node2;
355 + m_pList = Node1;
356 + Node1->data = anotherList.m_pList->data;
357 + Node1->pre = NULL;
358 + Node2 = anotherList.m_pList->next;
359 +
360 + while (Node2 != NULL)
361 + {
362 + Node1->next = new NodeType2<T>;
363 + preNode = Node1;
364 + Node1 = Node1->next;
365 + Node1->data = Node2->data;
366 + Node1->pre = preNode;
367 + Node2 = Node2->next;
368 +
369 +
370 + }
371 + Node1->next = NULL;
372 +
373 + }
374 +
375 +
376 +}
377 +
378 +template<typename T>
379 +UnSortedLinkedList<T> UnSortedLinkedList<T>::operator=(const UnSortedLinkedList<T> &anotherList)
380 +{
381 + MakeEmpty();
382 + UnSortedLinkedList<T> temp(anotherList);
383 +
384 + return temp;
385 +
386 +}
387 +
388 +
389 +#endif // !_SORTED_LINKED_LIST_H
...\ No newline at end of file ...\ No newline at end of file
1 +/**
2 +* @mainpage Array list.
3 +* This is a simple example of Lab01 on data structures course.<br>
4 +*
5 +* - Doxygen GUI 설정법<br>
6 +* Step 1: Doxygen 으로 문서화 할 프로젝트 경로 삽입.<br>
7 +* Step 2: Wizard 탭에서 Project Name 설정.<br>
8 +* Step 3: Wizard 탭에서 Source code directory 에 문서화 할 소스 경로 지정 후 Scan recursively 를 체크.
9 +* [Step 1] 의 경로와 같은 경로를 삽입해도 됨.<br>
10 +* Step 4: Destination directory 에 문서화한 데이터가 저장될 경로 지정.<br>
11 +* Step 5: Wizard 탭의 Output 에서 LaTeX 체크 해제.<br>
12 +* Step 6: Run 탭의 Run doxygen 수행 후, "Doxygen has finished" 확인.<br>
13 +*
14 +* - 한글사용을 위해서는 Doxywizard에서 아래와 같이 설정할 것.<br>
15 +* Expert 탭 -> Input (Topics 에서 선택) -> INPUT_ENCODING 을 "EUC-KR" 로 설정.
16 +*
17 +* @date 2018-10-11
18 +* @author 2016104132 안형준
19 +*/
20 +
21 +#include "Application.h"
22 +
23 +/**
24 +* program main function for data structures course.
25 +*/
26 +int main()
27 +{
28 + Application app; // Program application
29 + app.Run(); // run program
30 +
31 + return 0;
32 +}
...\ No newline at end of file ...\ No newline at end of file