import java.util.*;
abstract class Shape {
private Shape next;
public Shape() {
next = null;
}
public void setNext(Shape obj) { // 링크 연결
next = obj;
}
public Shape getNext() {
return next;
}
public abstract void draw(); // 추상 메소드
}
class Line extends Shape {
@Override
public void draw() {
System.out.println("Line");
}
}
class Rect extends Shape {
@Override
public void draw() {
System.out.println("Rect");
}
}
class Circle extends Shape {
@Override
public void draw() {
System.out.println("Circle");
}
}
public class exam12 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("그래픽 에디터 beauty을 실행합니다.");
Shape start = null, last = null; // 시작, 끝 노드 null로 초기화
int count = 0; // 연결된 노드 개수
while(true) {
System.out.print("삽입(1), 삭제(2), 모두 보기(3), 종료(4)>>");
try {
int menu = scan.nextInt();
// 삽입(1)
if(menu == 1) {
System.out.print("Line(1), Rect(2), Circle(3)>>");
int drawMenu = scan.nextInt();
Shape obj; // 삽입할 노드
if(drawMenu == 1 || drawMenu ==2 || drawMenu == 3) {
// 노드 객체 생성
if(drawMenu == 1) // Line(1)
obj = new Line();
else if(drawMenu == 2) // Rect(2)
obj = new Rect();
else // Circle(3)
obj = new Circle();
// 노드 삽입
if(start == null) // 연결된 노드 없음
start = last = obj;
else { // 마지막 노드와 연결 후 마지막 노드로 변경
last.setNext(obj);
last = obj;
}
count++; // 연결된 노드 개수 증가
}
else
System.out.println("없는 메뉴입니다.");
}
// 삭제(2)
else if(menu == 2) {
System.out.print("삭제할 도형의 위치>>");
int dlt = scan.nextInt();
Shape s = start; // 삭제할 노드(시작 노드에서 출발)
if(dlt < 1 || dlt > count)
System.out.println("삭제할 수 없습니다.");
else {
// 시작 노드 삭제
if(dlt == 1) {
if(count == 1) // 연결된 노드가 한 개
start = last = null; // null로 초기화
else // 연결된 노드가 여러 개
start = s.getNext(); // 시작 노드를 다음 노드로 변경
}
else {
// 삭제할 노드의 전 노드로 이동
for(int i=0; i<dlt-2; i++)
s = s.getNext();
// 끝 노드 삭제
if(dlt == count) {
last = s; // 끝 노드를 전 노드로 변경
last.setNext(null); // 원래 끝 노드 null로 초기화
}
// 중간 노드 삭제
else
s.setNext(s.getNext().getNext()); // 삭제할 노드의 전 노드를 다음 노드와 연결
}
count--; // 연결된 노드 개수 감소
}
}
// 모두 보기(3)
else if(menu == 3) {
Shape s = start; // draw()할 노드(시작 노드에서 출발)
// null이 아닐 때까지 반복
while(s != null) {
s.draw(); // draw() 오버라이딩
s = s.getNext(); // 다음 노드로 이동
}
}
// 종료(4)
else if(menu == 4)
break;
else
System.out.println("없는 메뉴입니다.");
}
catch(InputMismatchException e) {
System.out.println("없는 메뉴입니다.");
scan.nextLine();
continue;
}
}
System.out.println("beauty을 종료합니다.");
}
}