할껀하고놀자

[자료구조] C++로 Sorted ArrayList 만들기 본문

[IT]/Data Structure

[자료구조] C++로 Sorted ArrayList 만들기

working_hard 2018. 2. 22. 20:29
728x90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*과제 2번 수정사항
data를 m_id로 수정하면서 변수들 다 수정
m_name이라는 string 변수를 추가하면서 생기는 문제들 수정.
ArrayList.cpp 대폭 수정.
아이디로 search 하는지, 이름으로 search 하는지 구분하기 위한 함수 추가.
리스트 아이디 값에 따라 정렬하기
*/
 
#include<iostream>
#include"Application.h"
using namespace std;
 
int main() {
 
    Application app;
    app.Run();    
    //과제 1의 시작부분.. 대망의 시작이다.
    //과제 2 시작하기.
 
    return 0;
}
 
 
cs


main.cpp


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
#include "Application.h"
 
 
 
Application::Application()
{
}
Application::~Application()
{
}
void Application::Run()
{
    while (1)
    {
        m_Command = GetCommand();
 
        switch (m_Command)
        {
        case 1:        // read a record and add to list.
            AddItem();
            break;
        case 2:        // display all the records in list on screen.
            DisplayAllItem();
            break;
        case 3:        // make empty list.
            EmptyList();
            break;
        case 4:        // search item.
            SearchItem();
            break;
        case 5:        // delete item.
            DeleteItem();
            break;
        case 6:        // Replace item.
            ReplaceItem();
            break;
        case 7:        // load list data from a file.
            ReadDataFromFile();
            break;
        case 8:        // save list data into a file.
            WriteDataToFile();
            break;
        case 0:
            return;
        default:
            cout << "\tIllegal selection...\n";
            break;
        }
    }
}
int Application::GetCommand() {
    int command;
    cout << endl << endl;
    cout << "1. Add Item" << endl;
    cout << "2. Display All Items" << endl;
    cout << "3. Make Empty" << endl;
    cout << "4. Search Item" << endl;
    cout << "5. Delete Item" << endl;
    cout << "6. Replace Item" << endl;
    cout << "7. Read Data From File" << endl;
    cout << "8. Put To File" << endl;
    cout << "0. Quit" << endl;
 
    cout << endl << "choose a Command->";
    cin >> command;
    cout << endl;
 
    return command;
}
//1번 내용
void Application::AddItem() {
    cout << "Let's Add Item!" << endl;
    m_List.AddItem();
}
//2번 내용
void Application::DisplayAllItem() {
    cout << "Let's Display All Items!" << endl;
    m_List.DisplayAllItem();
}
//3번 내용
void Application::EmptyList() {
    cout << "Let's Make Empty List!" << endl;
    m_List.MakeEmpty();
}
//4번 내용
void Application::SearchItem() {
 
    cout << "Let's Search Item!" << endl;
    m_List.Search();
}
//5번 내용
void Application::DeleteItem() {
    cout << "Let's Delete Item!" << endl;
    m_List.Delete();
}
//6번 내용
void Application::ReplaceItem() {
    cout << "Let's Replace Item!" << endl;
    m_List.Replace();
}
//7번 내용
void Application::ReadDataFromFile() {
    cout << "Let's Read Data From File!" << endl;
    m_List.ReadData();
}
//8번 내용
void Application::WriteDataToFile() {
    cout << "Let's Write Data To File!" << endl;
    m_List.WriteData();
}
cs


Application.cpp


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
#include "ArrayList.h"
 
 
 
ArrayList::ArrayList()
{
    m_NumOfData = 0;
}
 
 
ArrayList::~ArrayList()
{
}
bool ArrayList::IsFull() {
    if (m_NumOfData == MAXSIZE) {
        cout << "List is Full!" << endl;
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}
 
int ArrayList::AddItem() {
    ItemType* tmp;
    ItemType data;
    data.SetDataFormKB();
    if (!IsFull()) // 가득 차지 않았을 경우
    {
        if (m_NumOfData == 0// 값이 없을경우 그냥 넣어줌
        {
            m_Array[m_NumOfData] = data;
            m_NumOfData++;
        }
        else
        {
            if (m_Array[0].GetId()>data.GetId()) // 넣는 값이 m_Array[0]보다 작을경우
            {
                tmp = new ItemType[m_NumOfData]; // 템프 동적할당
                for (int i = 0; i<m_NumOfData; i++// 템프에 저장
                {
                    tmp[i] = m_Array[i];
                }
                m_Array[0= data;
                for (int i = 0; i<m_NumOfData; i++// 값을 한칸씩 밀어 넣어줌
                {
                    m_Array[i + 1= tmp[i];
                }
                m_NumOfData++;
                delete[] tmp; //동적할당 딜리트
            }
            else if (m_Array[m_NumOfData - 1].GetId()<data.GetId()) // 넣는 데이터가 기존 배열에서 가장 큰 데이터보다 클 경우
            {
                m_Array[m_NumOfData] = data;
                m_NumOfData++;
            }
            else          //그 외 나머지. 중간에 들어가는 데이터
            {
                for (int i = 0; i<m_NumOfData; i++)
                {
                    if ((m_Array[i].GetId() < data.GetId()) && (m_Array[i + 1].GetId() >data.GetId())) // 중간에 넣을 경우
                    {
                        tmp = new ItemType[m_NumOfData - i - 1]; // 중간 뒤부터 동적할당
                        for (int j = 0; j<m_NumOfData - i - 1; j++// 임시변수에 저장
                        {
                            tmp[j] = m_Array[i + 1 + j];
                        }
                        m_Array[i + 1= data;
                        for (int j = 0; j<m_NumOfData - i - 1; j++// 값 넣어주기
                        {
                            m_Array[i + 2 + j] = tmp[j];
                        }
                    }
                }
                m_NumOfData++;
            }
        }
    }
    else
        return 0;
 
    cout << "Information Insert Successfully!" << endl;
    data.DisplayRecordOnScreen();
    return 1;
}
 
//2번 내용 출력해주는 함수.
void ArrayList::DisplayAllItem() {
    ItemType data;
    ResetCurPoint();
    int curIndex = GetNextItem(data);
    if (!m_NumOfData) {
        cout << "\nThere's nothing to show List in this array!" << endl;
    }
    while (curIndex < m_NumOfData && curIndex != -1)
    {
        data.DisplayRecordOnScreen();
        curIndex = GetNextItem(data);
    }
}
 
void ArrayList::ResetCurPoint() {
    m_CurPointer = -1;
}
 
int ArrayList::GetNextItem(ItemType& data) {
    m_CurPointer++;
    if (m_CurPointer == MAXSIZE) {
        return -1;
    }
    else {
        data = m_Array[m_CurPointer];
        return m_CurPointer;
    }
}
void ArrayList::MakeEmpty() {
    m_NumOfData = 0;
}
//4번 찾아주는 내용
void ArrayList::Search() {
    ItemType data;
    int temp;
    cout << "\n1. ID 값으로 이용자 찾기 ";
    cout << "\n2. 사용자 이름으로 이용자 찾기 " << endl << "->";
    cin >> temp;
    switch (temp)
    {
    case 1:    //아이디 값으로 찾고자 할 때
        if (GetDataByID(data)) {
            data.DisplayRecordOnScreen();
        }
        break;
    case 2:    //이름으로 찾고자 할 때
        if (GetDataByName(data)) {
            data.DisplayRecordOnScreen();
        }
    default:
        break;
    }
}
bool ArrayList::GetDataByID(ItemType& data) {
    data.FindDataByID();
    for (int i = 0; i < m_NumOfData; i++) {
        if (data.GetId() == m_Array[i].GetId()) {
            data = m_Array[i];
            cout << "Get Data Successfully!\n";
            return TRUE;
        }
    }
    cout << "Fail to find Data!\n";
    return FALSE;
}
bool ArrayList::GetDataByName(ItemType& data) {
    data.FindDataByName();
    for (int i = 0; i < m_NumOfData; i++) {
        if (data.GetName() == m_Array[i].GetName()) {
            data = m_Array[i];
            cout << "Get Data Successfully!\n";
            return TRUE;
        }
    }
    cout << "Fail to find Data!\n";
    return FALSE;
}
void ArrayList::Delete() {
    ItemType data;
    if (GetDataByID(data)) {
        cout << "\nDelete ID : " << data.GetId() << endl;
        for (int i = 0; i < MAXSIZE; i++) {
            if (data.GetId() == m_Array[i].GetId()) {
                if (i == MAXSIZE - 1) {
                    m_NumOfData--;
                    //배열 갯수 5개면 0~4배열이 형성된다. i가 4이면 
                    //맨 끝이기 때문에 걍 숫자 하나만 줄여주면 된다.
                }
                //하지만 2,3위치에 있는 경우 뒷 배열을 다 끌어와야한다. 그래서 맥스사이즈
                //까지 배열을 땡겨주는 작업을 거친다. 
                else
                {
                    for (i; i < MAXSIZE-1; i++) {
                        m_Array[i] = m_Array[i + 1];
                    }
                    m_NumOfData--;
                }
            }
        }
        DisplayAllItem();
    }
    else
    {
        cout << " There's no data in this array!" << endl;
    }
}
void ArrayList::Replace() {
    ItemType data;
    if (GetDataByID(data)) {
        cout << "Let's Replace \"" << data.GetId() << "\" data!" << endl;
        for (int i = 0; i < MAXSIZE; i++) {
            if (data.GetId() == m_Array[i].GetId()) {
                cout << endl;
                m_Array->SetDataFormKB();
            }
        }
        cout << "Replace successfully!" << endl << endl;
    }
}
//수정 필요함. 파일 안의 내용 완전히 안가져와짐
//리턴값 수정으로 완료함.
bool ArrayList::ReadData() {
    int index = 0;
    ItemType data;
 
    char filename[1000];
    cout << "\n\nEnter input file name : ";
    cin >> filename;
 
    m_InFile.open(filename);
 
    if (m_InFile.is_open()) {
        while (!m_InFile.eof())
        {
            data.ReadDataFromFile(m_InFile);
            if (!IsFull())
            {
                m_Array[m_NumOfData] = data;
                m_NumOfData++;
                data.DisplayRecordOnScreen();
            }
            else
            {
                cout << "List is Full!!" << endl;
                return FALSE;
            }
        }
        m_InFile.close();
        return TRUE;
    }
    else {
        return FALSE;
    }
 
}
bool ArrayList::WriteData() {
    ItemType data;
 
    char filename[1000];
    cout << "\n\nEnter Output file name : ";
    cin >> filename;
 
    m_OutFile.open(filename);
 
    if (m_OutFile.is_open()) {
        //참조변수 초기화.
        ResetCurPoint();
        int curIndex = GetNextItem(data);
        while (curIndex < m_NumOfData && curIndex != -1)
        {
            data.WriteDataToFile(m_OutFile);
            curIndex = GetNextItem(data);
        }
 
        m_OutFile.close();    // file close
 
        return 1;
    }
    else
    {
        return 0;
    }
    return 1;
}
cs


ArrayList.cpp


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
#include "ItemType.h"
 
 
 
ItemType::ItemType()
{
}
 
 
ItemType::~ItemType()
{
}
void ItemType::SetDataFormKB() {
    cout << "Input ID->";
    cin >> m_id;
    cout << "Input Name->";
    cin >> m_name;
}
void ItemType::FindDataByID() {
    cout << "Input ID->";
    cin >> m_id;
}
void ItemType::FindDataByName() {
    cout << "Input Name->";
    cin >> m_name;
}
void ItemType::DisplayRecordOnScreen() {
    cout << "----------------------------" << endl;
    cout << "ID : " << GetId() << endl;
    cout << "Name : " << GetName() << endl;
    cout << "----------------------------" << endl;
}
int ItemType::GetId() {
    return m_id;
}
string ItemType::GetName() {
    return m_name;
}
void ItemType::GetInformation() {
    GetId();
    GetName();
}
int ItemType::ReadDataFromFile(ifstream& fin) {
    fin >> m_id;
    fin >> m_name;
    return 1;
}
int ItemType::WriteDataToFile(ofstream& fout) {
    fout << endl;
    fout << m_id << ' ';
    fout << m_name;
 
    return 1;
}
cs


ItemType.cpp



Sorted List 구현 완료.



어려웠던 부분


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
 
int ArrayList::AddItem() {
    ItemType* tmp;
    ItemType data;
    data.SetDataFormKB();
    if (!IsFull()) // 가득 차지 않았을 경우
    {
        if (m_NumOfData == 0// 값이 없을경우 그냥 넣어줌
        {
            m_Array[m_NumOfData] = data;
            m_NumOfData++;
        }
        else
        {
            if (m_Array[0].GetId()>data.GetId()) // 넣는 값이 m_Array[0]보다 작을경우
            {
                tmp = new ItemType[m_NumOfData]; // 템프 동적할당
                for (int i = 0; i<m_NumOfData; i++// 템프에 저장
                {
                    tmp[i] = m_Array[i];
                }
                m_Array[0= data;
                for (int i = 0; i<m_NumOfData; i++// 값을 한칸씩 밀어 넣어줌
                {
                    m_Array[i + 1= tmp[i];
                }
                m_NumOfData++;
                delete[] tmp; //동적할당 딜리트
            }
            else if (m_Array[m_NumOfData - 1].GetId()<data.GetId()) // 넣는 데이터가 기존 배열에서 가장 큰 데이터보다 클 경우
            {
                m_Array[m_NumOfData] = data;
                m_NumOfData++;
            }
            else          //그 외 나머지. 중간에 들어가는 데이터
            {
                for (int i = 0; i<m_NumOfData; i++)
                {
                    if ((m_Array[i].GetId() < data.GetId()) && (m_Array[i + 1].GetId() >data.GetId())) // 중간에 넣을 경우
                    {
                        tmp = new ItemType[m_NumOfData - i - 1]; // 중간 뒤부터 동적할당
                        for (int j = 0; j<m_NumOfData - i - 1; j++// 임시변수에 저장
                        {
                            tmp[j] = m_Array[i + 1 + j];
                        }
                        m_Array[i + 1= data;
                        for (int j = 0; j<m_NumOfData - i - 1; j++// 값 넣어주기
                        {
                            m_Array[i + 2 + j] = tmp[j];
                        }
                    }
                }
                m_NumOfData++;
            }
        }
    }
    else
        return 0;
 
    cout << "Information Insert Successfully!" << endl;
    data.DisplayRecordOnScreen();
    return 1;
}
cs


조금 더 분석이 필요하다.

Comments