상세 컨텐츠

본문 제목

Class Single Linked List

개발생활/C C++

by 한국인맛집 2017. 6. 6. 22:24

본문

반응형

클래스로 구현한 LinkedList 출력 형태 


1. 데이터값을 입력받는 메뉴

2. 값을 삭제하는 메뉴

3. 데이터를 전부 출력하는 메뉴

0. 종료

그외의 값을 입력시 잘못된값 입력 Exception 처리 완료. (STL의 try catch문이 아직 이해부족으로 if, else 문으로 처리하였습니다.)



Class 사용이 어렵다면 struct 로 구현해도 가능.

struct로 구현하게된다면 메인함수에서 instance 생성하지 않고, 선언하여 firstNode 를 선언(Node* firstNode = new Node()  ) 형식으로 사용하여도 가능합니다.


지난번엔 class 공부가 부족하여 클래스 를 구현하고, 클래스 내부에 struct 로 구현한 내용이 있습니다.


struct 부분을 Class 로 바꾸는 부분은 정말 쉬우며. 그냥. 인스턴스 로 사용하여도 가능합니다.


하단 링크  : 클래스 로 외부를 디자인하고 내부에 struct 구현.

2017/05/22 - [Programming/자료구조] - Linked_list [data_struct]












Code::



list.h








#ifndef __LIST_H__
#define __LIST_H__


class Node {
public:
		Node* next = nullptr;
		int data;
};

// Node 클래스는 다음을 가리키는 next멤버와
// int 형 data 변수를 가지고있음.

/*

struct Node{

Node* next = nullptr;
int data;

}
*/

class LinkedList {
private:
	Node* getNode(Node* first, int index);
	int listIndex = 0;
public:
	void insert(Node* first, int index, int data);
	void remove(Node* first, int index);
        void printAll(Node* first);
};

#endif

#include"list.h"
#incldue <cstdio>
Node* LinkedList::getNode(Node* first, int index) {

	Node* start = first;
	// 리스트의 노드가 시작되는 지점.
	for (int i = 0; i <= index; i++) {
		start = start->next;
	}
	// 만약노드가 처음 삽입된다면 현재 노드를 리턴해준다.
	// 아니라면 점프점프 노드의 next 값을 계속 점프한다
	return start;
}


void LinkedList::insert(Node* first, int index, int data) {

	if (index > listIndex) {
		printf("잘못된값 입력\n");
		return;
	}

	else {

Node* node = new Node();

			node->data = data;
			Node* prev = getNode(first, index - 1);

			      // 링크드 리스트의 기본인
			      // 현재노드와 이전 노드의 값, 위치를 알아야함.
			      // 그러므로 index-1 을함.
			      // 예를들어 인덱스 3에 값을 삽입하려고하면
			      // prev 노드의 값을 가져오는건 3-1 인 2 번째 노드를리턴.

			Node* curr = prev->next;
			       // curr 노드는 현재 위치 즉, 삽입하기전 현재위치를 뜻함.
			node->next = curr;
			prev->next = node;
			listIndex++;

		}
}
void LinkedList::remove(Node* first, int index) {

// 삭제에선 3개의 노드가 필요로 한다.
// 지울노드와 이전노드 지울노드의 다음노드가 필요함.

	if (LinkedList::listIndex <= 0 || LinkedList::listIndex next;

		// 지울노드.

		Node* nextNode = deleteNode->next;

	         	// 다음노드.
		prev->next = nextNode;
	         	// 이전노드을 다음을 다음노드로 변경
		       // 순서는 중요하지않음. 노드의 정보를 알고잇기때문.
		listIndex--;
		delete deleteNode;
		// 지울노드를 지운다.
	}
}



void LinkedList::printAll(Node* first) {
	if (listIndex <= 0) {
		printf("데이터가 없습니다.\n");
	}
	else {
		Node* start = first->next;
		     // 입력받은것을 컨트롤함.
		while (start!= nullptr) {
			printf("[%d]-> ", start->data);
			start = start->next;
		}
		printf("\n");
	}
}



#include"list.h"

#include <cstdio>
#include <windows.h> int integerInput() { int inputNumber; fseek(stdin, 0, SEEK_END); scanf("%d", &inputNumber); return inputNumber; } void printDialog(char* str) { printf("%s\n", str); } int main() { Node* node = new Node(); LinkedList* list = new LinkedList(); while (true) { printDialog("Single LinkedList !\n\n"); printDialog("1.데이터입력"); printDialog("2.값삭제"); printDialog("3.데이터 출력"); printDialog("0.종료"); int inputMenu; int input, index; fseek(stdin, 0, SEEK_END); scanf("%d", &inputMenu); if (inputMenu == 0) { printDialog("프로그램종료\n"); break; } else if (inputMenu == 1) { printDialog("Input the index\n"); index = integerInput(); printDialog("Input the Data\n"); input = integerInput(); list->insert(node, index, input); } else if (inputMenu == 2) { printDialog("remove index"); index = integerInput(); list->remove(node, index); } else if (inputMenu == 3) { system("cls"); list->printAll(node); printDialog("\n\n"); } else { printDialog("잘못된값 입력하셨습니다.\n"); } } fseek(stdin, 0, SEEK_END); fgetc(stdin); return 0; }


반응형

'개발생활 > C C++' 카테고리의 다른 글

C/C++ multi Thread  (0) 2017.10.17
static used in class C++  (0) 2017.09.05
Cmd command  (0) 2017.08.22
Template / Single LinkedList 구현 과정.  (0) 2017.06.07
C++ 게시판만들기.  (0) 2017.06.06
Overload ( operator overloading) 예제  (0) 2017.05.24

관련글 더보기