C++

C++ 원형 LinkedList

Machine_웅 2022. 11. 2. 08:53
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