forked from illgami784/2019-2-Data-Structure
-
Notifications
You must be signed in to change notification settings - Fork 0
/
UnsortedList.h
274 lines (238 loc) · 4.99 KB
/
UnsortedList.h
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
#ifndef _UNSORTEDLIST_H
#define _UNSORTEDLIST_H
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
template <typename T>
class UnsortedList
{
public:
/**
* default constructor.
*/
UnsortedList()
{
m_Length = 0;
max = 0;
ResetList();
}
UnsortedList(int _max)
{
m_Length = 0;
max = _max;
m_Array = new T[max];
ResetList();
}
/**
* destructor.
*/
~UnsortedList()
{
delete[] m_Array;
}
/*
* 기본 생성자 사용시를 위한 함수.
*/
int setMax(int _max)
{
max = _max;
m_Array = new T[max];
}
/**
* @brief Make list empty.
* @pre none.
* @post clear list.
*/
void MakeEmpty();
/**
* @brief Get a number of records in current list.
* @pre none.
* @post none.
* @return number of records in current list.
*/
int GetLength();
/**
* @brief Check capacity of list is full.
* @pre none.
* @post none.
* @return return true if list capacity reached to the upper bound, otherwise return false.
*/
bool IsFull();
/**
* @brief add a new data into list.
* @pre list should be initialized.
* @post added the new record into the list.
* @param data new data.
* @return return 1 if this function works well, otherwise 0.
*/
int Add(T data);
/**
* @brief Initialize list iterator.
* @pre list should be initialized.
* @post iterator is reset.
*/
void ResetList();
/**
* @brief move list iterator to the next item in list and get that item.
* @pre list and list iterator should not be initialized.
* @post iterator is moved to next item.
* @param data get current iterator's item. it does not need to be initialized.
* @return index of current iterator's item if is not end of list, oterwise return -1.
*/
int GetNextItem(T& data);
/** [작성]
* @brief 입력받은 데이터의 Id가 기존의 존재하는 거랑 같을시 그 아이템의 포인터를 반환
* @pre 아이템이 1개라도 존재해야함.
* @post none
* @param data 서치할 아이템 Id만을 가지면 됨
* @return Id가 같은 아이템의 포인터
*/
int Get(T& data);
/** [작성]
* @brief 입력받은 데이터의 시간이 기존의 존재하는 거랑 같을시 그 아이템을 삭제
* @pre 아이템이 하나라도 존재해야함.
* @post 아이템이 하나 삭제됩니다.
* @param data 삭제할 아이템 시간만을 가지면 됨
* @return none
*/
void Delete(T data);
/** [작성]
* @brief 입력받은 데이터의 Id가 기존의 존재하는 거랑 같을시 그 아이템을 입력받아 갱신
* @pre 아이템이 하나라도 존재해야함
* @post 아이템 레코드를 대체합니다.
* @param data 삭제할 아이템 Id만을 가지면 됨
* @return none
*/
void Replace(T data);
private:
T* m_Array; ///< list array.
int m_Length; ///< number of elements in list.
int m_CurPointer; ///< iterator pointer.
int max;
};
#endif
// Make list empty.
template <typename T>
void UnsortedList<T>::MakeEmpty()
{
m_Length = 0;
}
// Get a number of records in current list.
template <typename T>
int UnsortedList<T>::GetLength()
{
return m_Length;
}
// Check capacity of list is full.
template <typename T>
bool UnsortedList<T>::IsFull()
{
if (m_Length > max - 1)
return true;
else
return false;
}
// add a new data into list.
template <typename T>
int UnsortedList<T>::Add(T inData)
{
if (IsFull()) {
cout << "\n\t리스트가 가득 찼습니다.";
return 0;
}
int location = 0;
bool moreToSearch;
moreToSearch = (location < m_Length);
while (moreToSearch) {
if (inData == m_Array[location])
{
cout << "\n\t동일한 ID가 존재합니다.";
return 0;
}
else if(inData < m_Array[location])
{
location++;
moreToSearch = (location < m_Length);
}
else
{
moreToSearch = false;
}
}
cout << "\n\t추가에 성공했습니다.";
for (int i = m_Length; i > location; i--) {
m_Array[i] = m_Array[i - 1];
}
m_Array[location] = inData;
m_Length++;
return 1;
}
template <typename T>
int UnsortedList<T>::Get(T& data) {
T temp;
ResetList();
GetNextItem(temp);
while (m_CurPointer < m_Length) {
if (inData == m_Array[location])
{
data = temp;
return 1;
}
else if (inData < m_Array[location])
{
return 0;
}
else
{
GetNextItem(temp);
break;
}
}
return 0;
}
template <typename T>
void UnsortedList<T>::Delete(T data) {
int location = 0;
while ( data != m_Array[location]) {
if (location >= m_Length) {
cout << "\n\tID가 같은 값이 없습니다.";
return;
}
location++;
}
for (int i = location + 1; i < max; i++) {
m_Array[i - 1] = m_Array[i];
}
cout << "\n\t삭제에 성공했습니다.";
m_Length--;
}
template <typename T>
void UnsortedList<T>::Replace(T data) {
T temp = data;
if (Get(data)) {
cout << "\n\t" << "대체 성공했습니다.";
m_Array[m_CurPointer] = data;
}
else
{
cout << "\n\t" << "같은 값이 없어 대체에 실패했습니다.";
return;
}
}
// Initialize list iterator.
template <typename T>
void UnsortedList<T>::ResetList()
{
m_CurPointer = -1;
}
// move list iterator to the next item in list and get that item.
template <typename T>
int UnsortedList<T>::GetNextItem(T& data)
{
m_CurPointer++; // list pointer 증가
if (m_CurPointer == max) // end of list이면 -1을 리턴
return -1;
data = m_Array[m_CurPointer]; // 현재 list pointer의 레코드를 복사
return m_CurPointer;
}