728x90
반응형
// 선행처리 지시문
#include <iostream>
#include <algorithm>
#include <string>
#include <iomanip>
#include "CLink.h"
// -< Circle Linked List >------------------------------------------------------------------
void addCircleData( CLink* list, CLink* data );
void createData( CLink* list );
void deleteCircleData( CLink* list );
void readCircleData( CLink* list, int n );
void showCircleMenu();
void selectCircleMenu( int menuChoice, CLink* list );
CLink* searchDataInCircle( CLink* list );
void searchDataInCircleRL( CLink* list );
// ----------------------------------------------------------------------------------------------
int main() {
CLink* list = new CLink;
int menuChoice = 0;
while ( true ){
showCircleMenu();
cin >> menuChoice;
if ( menuChoice == -1 ) {
break;
}
else {
selectCircleMenu( menuChoice , list );
}
}
return 0;
}
void showCircleMenu() {
cout << "=====<<CircleMenu 메뉴 선택>>=====" << endl;
cout << "1.리스트 보기 " << endl;
cout << "2.데이터 추가" << endl;
cout << "3.데이터 탐색 " << endl;
cout << "4.데이터 좌우 탐색" << endl;
cout << "5.데이터 삭제" << endl;
cout << "-1. 프로그램 종료" << endl;
cout << "============================== " << endl << endl;
}
void selectCircleMenu(int menuChoice , CLink* list ) {
switch ( menuChoice )
{
case 1: { // 리스트 보기
readCircleData( list, 0 );
break;
}
case 2: { // 추가
createData( list );
break;
}
case 3: { // 탐색
searchDataInCircle( list );
break;
}
case 4: { // 좌우탐색
searchDataInCircleRL( list );
break;
}
case 5: { // 삭제
deleteCircleData( list );
break;
}
default:
break;
}
}
// 데이터 생성
void createData( CLink* list ) {
string inputData = "";
int choiceDirection = 0;
cout << "=======<< 데이터 추가 >>=======" << endl;
cout << "데이터를 입력해 주세요 => ";
cin >> inputData;
CLink* mData = new CLink;
mData->setData( inputData );
addCircleData( list, mData );
}
// 모든 데이터 읽기
void readCircleData( CLink* list, int n) {
n = n + 1;
if ( list->getNextNode() == nullptr && list->getPreNode() == nullptr && list->getHead() == false ) {
cout << "noData" << endl;
return;
}
if ( list->getHead() == true ) {
cout << n << "번째 데이터(헤더) " << list->getData() << endl;
if ( list->getNextNode() == nullptr ) {
return;
}
}
else {
if ( list->getNextNode() == nullptr || list->getNextNode()->getHead() == true ) {
cout << n << "번째 데이터( 끝 ) " << list->getData() << endl;
return;
}
else {
cout << n << "번째 데이터 " << list->getData() << endl;
}
}
readCircleData( list->getNextNode(), n );
}
// 헤더 오른쪽에 데이터 추가
void addCircleData(CLink * list, CLink * data) {
if ( list->getNextNode() == nullptr && list ->getPreNode() == nullptr && list ->getData() == "" ) {
list->setData(data->getData());
list->setHead( true );
cout << "최초 데이터 " << list->getData()<< endl;
}
else {
// 최초 데이터는 초기 좌 우가 없다. ( 두번째 데이터 까진 이렇게 들어옴 )
if ( list->getNextNode() == nullptr ) {
list->setNextNode( data );
list->setPreNode( data );
data->setPreNode( list );
data->setNextNode( list );
}
else {
CLink* tmpData = new CLink;
tmpData->setNextNode( list->getNextNode() );
tmpData->setPreNode( list->getNextNode()->getPreNode() );
list->setNextNode( data );
data->setPreNode( list );
tmpData->getNextNode()->setPreNode( data );
data->setNextNode( tmpData->getNextNode() );
}
}
}
// 데이터 탐색
CLink* searchDataInCircle( CLink* list ) {
string inputData = "";
int choiceDirection = 0;
cout << "=======<< 데이터 찾기 >>=======" << endl;
cout << "찾을 데이터를 입력해 주세요 => ";
cin >> inputData;
CLink* tmp = list;
CLink* result = new CLink;
int i = 0;
while ( true )
{
i++;
if ( tmp->getData() == inputData ) {
cout << "데이터는 " << i << " 번째에 있습니다."<<endl;
result = tmp;
break;
}
else {
if ( tmp->getNextNode() == nullptr ) {
cout << "찾는 데이터가 없습니다. " << endl;
break;
}
else {
tmp = tmp->getNextNode();
}
}
}
return result;
}
// 데이터 탐색 좌우
void searchDataInCircleRL( CLink* list ) {
CLink* current = list;
while ( true )
{
cout << "= 현재 데이터 =====================" << endl ;
if ( current->getHead() == true ) {
cout << "= 헤더 = " << endl;
}
cout << "= data :" << current->getData() << "=================== " << endl << endl;
int inputData;
cout << "노드 왼쪽 탐색 : 1 " << endl;
cout << "노드 오른쪽 탐색 : 2 " << endl;
cout << "탐색 종료 : -1 => ";
cin >> inputData;
if ( inputData == 2 ) {
if ( current->getNextNode() == nullptr ) {
cout << "= 다음 노드로 이동할 수 없습니다.=" << endl;
}
else {
current = current->getNextNode();
}
}
else if ( inputData == 1 ) {
if ( current->getPreNode() == nullptr ) {
cout << "= 이전 노드로 이동할 수 없습니다.=" << endl;
}
else {
current = current->getPreNode();
}
}
else if ( inputData == -1) {
break;
}
else {
cout << "= 잘못 선택 하셨습니다.=" << endl;
}
}
}
// 데이터 삭제
void deleteCircleData( CLink* list ) {
cout << "==< 목록 > ===================" << endl;
readCircleData( list, 0 );
int inputData;
cout << "삭제할 데이터 번호를 입력하세요 => : ";
cin >> inputData;
cout << "===========================" << endl << endl;
// 삭제하려는 헤더인경우 헤더를 다음거로 이동
CLink* moving = list;
for ( int i = 0; i < inputData; i++ ) {
if ( i == inputData-1 ) { // 삭제 하려는 노드 발견
if ( moving->getHead() == true ) {
// 다음노드
CLink* tmp = moving->getNextNode();
if ( tmp == nullptr ) { // 데이터가 1개 만있던 경우
cout << "모든 데이터가 삭제 되었습니다. "<< endl;
list->setHead(false);
list->setNextNode( nullptr );
list->setPreNode( nullptr );
list->setData("");
} else { // 데이터가 1개 이상인경우.
list->setHead( true );
list->setNextNode( nullptr );
list->setPreNode( nullptr );
list->setData( tmp->getData() );
delete tmp;
}
}
else {
CLink* tmp = moving;
tmp->getPreNode()->setNextNode( tmp->getNextNode());
tmp->getNextNode()->setPreNode( tmp->getPreNode() );
delete tmp;
}
}
moving = moving->getNextNode();
}
}
CLink.h
#ifndef CLink_H
#define CLink_H
#include <string>
#include <iostream>
using namespace std;
using std::string;
// 양방항 서클 링크드 리스트
class CLink{
private :
bool isHead = false;
string data = "";
CLink* PreNode = nullptr; // 이전노드 주소
CLink* NextNode = nullptr; // 다음노드 주소
public :
CLink();
void setHead(bool isHead);
bool getHead();
void setData( string data );
string getData();
void setPreNode( CLink* node );
CLink* getPreNode();
void setNextNode( CLink* node );
CLink* getNextNode();
};
#endif // ! CLink_H;
728x90
반응형
'C++' 카테고리의 다른 글
C++ 배열 (0) | 2022.11.01 |
---|---|
C++ Linked List ( 단방향 ) (0) | 2022.11.01 |
C++ 클래스 생성 / 헤더파일. (0) | 2022.10.28 |
C++ 함수 포인터 (0) | 2022.10.27 |
C++ 공용체 ( union ) (0) | 2022.10.27 |