Notice
Recent Posts
Recent Comments
Link
할껀하고놀자
[자료구조] C++로 Sorted ArrayList 만들기 본문
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 |
조금 더 분석이 필요하다.
'[IT] > Data Structure' 카테고리의 다른 글
[자료구조] C++로 Unsorted ArrayList 만들기 (0) | 2018.02.21 |
---|---|
[자료구조] C++로 정렬되지 않은 배열리스트 만들기 (0) | 2018.02.20 |
Comments