728x90
[소스코드]
[소스코드]
Node.java
package hwlinkedlist;
public class Node {
//필드
private String name;
private int pointSum;
private Node next;
//생성자
public Node(String n, int pointMath, int pointKorean, int pointEnglish) {
this.name = n;
this.pointSum = pointEnglish + pointKorean + pointMath;
next = null;
}
//Getter, Setter 메소드
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPointSum() {
return pointSum;
}
public void setPointSum(int pointSum) {
this.pointSum = pointSum;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
LinkedList.java
public class LinkedList {
//필드
private Node head;
//생성자
public LinkedList() {
head = null;
}
//연결리스트 속 head노드 반환 getter 메소드
public Node getHead() {
return head;
}
//-----<기능 추가 과제>-------
//기능 추가(1)_성적반환: 학생 이름 받아서 해당 학생의 성적 반환하는 메소드
public int getPoint(String name) {
Node currentNode = head;
int Point = -1; // 반환할 성적 변수 -1 초기화
if (currentNode != null) {
while (currentNode != null) {
if (currentNode.getName().equals(name)) {
Point = currentNode.getPointSum();
break;
}
currentNode = currentNode.getNext();
}
}
return Point;
}
//기능 추가(2)_삽입: 학생 성적 순으로 삽입 메소드
public void insertByPoint(Node node) {
Node currentNode = this.head;
if (currentNode != null) {
while (currentNode != null) {
if (currentNode.getPointSum() <= node.getPointSum()) {
if (currentNode.equals(this.head)) {
this.head = node;
node.setNext(currentNode);
}else {
int position = getIndex(currentNode.getPointSum());
Node prevNodeNotHead = this.head;
for (int i = 0; i < position - 1; i++) {
prevNodeNotHead = prevNodeNotHead.getNext();
}
prevNodeNotHead.setNext(node); //앞 연결
node.setNext(currentNode);//뒤 연결
}
break;
}
currentNode = currentNode.getNext();//next 따라 다음 노드로 이동
}
//while문 탈출 : 삽입할 node 성적합이 가장 작아 null되어 탈출
if (currentNode == null) {
currentNode = findLastNode(); //currentNode <- 마지막 노드 지칭
currentNode.setNext(node); //currentNode.next = 삽입할 node 연결
}
}
else {
insertLast(node); //현재 node를 마지막 노드로 삽입
}
}
//기능 추가(3)_삭제: 학생 이름 입력받은 후 해당 학생 노드 삭제 메소드
public int deleteNode(String name) {
if (this.head.getName().equals(name)) {
this.head = this.head.getNext();
return 0; //종료
}
Node currentNode = this.head;
int deletedIndex = -1; //삭제 위치 지정 변수 -1 초기화
if (currentNode != null) {
while (currentNode != null) {
if (currentNode.getName().equals(name)) {
deletedIndex = getIndex(name);
Node prevNode = this.head;
for (int i = 0; i < deletedIndex - 1; i++) {
prevNode = prevNode.getNext();
}
//for문 탈출 후, 삭제 직전 위치 지칭 중인 prevNode
prevNode.setNext(currentNode.getNext());
break;
}
currentNode = currentNode.getNext();
}
}
return deletedIndex;
}
//마지막 노드 삽입 위치 탐색 메소드
public Node findLastNode() {
Node n = head; //head부터 순회할 노드 n
if (n != null) {
while (n.getNext() != null) {
n = n.getNext();
}
}
return n;
}
//중간 노드 삽입: 점수 기준으로 삽입 위치 직전 노드 탐색 메소드
public Node findPrevNode(int point) {
if (head.getPointSum() < point) return null;
Node n = head, prev = null;
while (n != null) {
if (n.getPointSum() < point) {
prev = n;
n = n.getNext();
}
}
return prev;
}
//마지막 노드로 삽입 메소드
public void insertLast(Node n) {
if (head == null) head = n;
else {
Node node = findLastNode();
node.setNext(n);
}
}
//중간 노드로 삽입 메소드
public void insertMiddle(Node n) {
Node node = findPrevNode(n.getPointSum());
if (node == null) {
n.setNext(head);
head = n;
}else {
n.setNext(node.getNext()); //뒤 연결
node.setNext(n);//앞 연결
}
}
//"point값 기준" -> 위치 반환 메소드
public int getIndex(int point) {
Node currentNode = this.head;
int counter = 0; //위치 카운터 변수
while (currentNode != null) {
if (currentNode.getPointSum() == point) {
break;
}
currentNode = currentNode.getNext();
counter++;
}
return counter; //성적합 기준으로 찾은 노드 인덱스 위치 반환
}
//"name값 기준" -> 위치 반환 메소드
public int getIndex(String name) {
Node currentNode = this.head;
int counter = 0; //위치 카운터 변수
while (currentNode != null) {
if (currentNode.getName().equals(name)) {
break;
}
currentNode = currentNode.getNext();
counter++;
}
return counter; //이름값 기준으로 찾은 노드 인덱스 위치 반환
}
//전체 순회하며 리스트 전체 출력 메소드
public void showAll() {
if (head == null) System.out.println("연결리스트 내부에 node 객체 없는 상태");
else {
Node n = head;
do {
System.out.print("(" + n.getName() + "," + n.getPointSum() + ") -> ");
n = n.getNext();
}while (n != null);
}
}
//실행 main메소드
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.insertByPoint(new Node("김", 95, 38, 79));
list.insertByPoint(new Node("서", 91, 90, 43));
list.insertByPoint(new Node("이", 88, 84, 99));
list.insertByPoint(new Node("황", 62, 49, 82));
list.insertByPoint(new Node("주", 26, 40, 65));
list.insertByPoint(new Node("정", 83, 93, 95));
list.insertByPoint(new Node("구", 69, 47, 81));
list.insertByPoint(new Node("강", 5, 84, 13));
list.insertByPoint(new Node("선", 27, 54, 28));
list.insertByPoint(new Node("우", 45, 4, 13));
System.out.println("\n\n----삽입 완료된 상태 출력----\n\n");
list.showAll();
System.out.println("\n\n '서 학생' 삭제 후 출력 ");
list.deleteNode("서");
System.out.println("\n");
list.showAll();
System.out.println("\n\n '이 학생' 삭제 후 출력 ");
list.deleteNode("이");
System.out.println("\n");
list.showAll();
System.out.println("\n\n '김 학생' 삭제 후 출력 ");
list.deleteNode("김");
System.out.println("\n");
list.showAll();
}
}
[실행화면]
[코드설명]
-->[노드 변경]
-노드 객체 생성 시,
(이름, 국어, 영어, 수학)를 받아서 (이름, 성적합) 구조로 노드 객체가 생성되어야 하므로
노드 클래스의 생성자를 변경했다.
//생성자
public Node(String n, int pointMath, int pointKorean, int pointEnglish) { //이름, 국,영,수 세 과목 받아서
this.name = n;
this.pointSum = pointEnglish + pointKorean + pointMath; //성적합을 노드 pointSum필드값에 저장
next = null;
}
-노드 객체를 삽입,삭제 시, 노드 객체의 필드값을 안전하게 변경하고 사용하기 위해
노드의 내부 필드는 private로 바꿔주고, public Getter,Setter() 메소드를 추가했다.
//필드
private String name;
private int pointSum;
private Node next;
//Getter, Setter 메소드
public String getName() { //노드 객체의 이름 필드값 -> 외부로 리턴
return name;
}
public void setName(String name) { //호출 시 받은 이름으로 노드 객체의 name필드값 변경
this.name = name;
}
public int getPointSum() { //노드 객체의 성적합 -> 외부로 리턴
return pointSum;
}
public void setPointSum(int pointSum) { //호출 시 받은 성적합으로 노드 객체의 pointSum필드값 변경
this.pointSum = pointSum;
}
public Node getNext() {//노드 객체의 next필드값 -> 외부로 리턴
return next;
}
public void setNext(Node next) { //호출 시 받은 next값으로 노드 객체의 next필드값 변경
this.next = next;
}
-->[추가한 메소드 (1)] : int getPoint(String)
: 학생 이름 인수로 받아서, 해당 학생의 성적 반환
: 해당 학생 없을 경우 –1 반환
//기능 추가(1)_성적반환: 학생 이름 받아서 해당 학생의 성적 반환하는 메소드
public int getPoint(String name) {
Node currentNode = head; //리스트의 head부터 순회하며 현재 노드 지칭할 노드
int Point = -1; //반환할 성적 변수 –1 초기화, (해당 학생 찾지 못하면 –1 반환하도록)
if (currentNode != null) {
while (currentNode != null) { //순회 중인 노드가 null 아닌 동안 반복
if (currentNode.getName().equals(name)) {//if 현재 노드 name값 = 매개값 name 인 경우
Point = currentNode.getPointSum(); //반환될 Point값에 현재노드의 성적합을 저장
break; //반복문 탈출
}
currentNode = currentNode.getNext();//next필드 따라 다음 노드로 이동
}
}
return Point; //반복문 탈출하여 저장된 성적합을 반환
}
-->[추가한 메소드 (2)] :void insertByPoint(Node)
: 연결리스트에 학생노드를 성적 순 (내림차순) 삽입
-> 리스트 전체를 순회하면서 삽입할 노드의 point 값과 비교하여 삽입 수행해야 한다.
//기능 추가(2)_삽입: 학생 성적 순으로 삽입 메소드
public void insertByPoint(Node node) {
Node currentNode = this.head; //head부터 순회하며 현재 노드 지칭할 노드
if (currentNode != null) {
while (currentNode != null) { //현재노드 null 아닌 동안 반복
if (currentNode.getPointSum() <= node.getPointSum()) {
//만약 현재노드.point <= 삽입 노드 point 인 경우
if (currentNode.equals(this.head)) { //만약 리스트의 head라면
this.head = node; //기존의 head 뒤로 노드 삽입
node.setNext(currentNode); 삽입노드의 next필드 다시 세팅
}else { //head 아닌 경우
int position = getIndex(currentNode.getPointSum());//point기준으로 삽입 위치 찾고
Node prevNodeNotHead = this.head; //head부터 순회하며 직전노드 지칭할 노드
for (int i = 0; i < position - 1; i++) { //for돌면서 삽입위치의 앞노드를 찾음
prevNodeNotHead = prevNodeNotHead.getNext();
}
prevNodeNotHead.setNext(node); //앞 연결 (직전노드의 next에 삽입노드 연결)
node.setNext(currentNode);//뒤 연결 (삽입 노드의 next에 현재노드 연결)
}
break;
}
currentNode = currentNode.getNext();//next 따라 다음 노드로 이동
}
//while로 전체 순회하면서 삽입노드의 성적합이 가장 작아 null되어 탈출한 경우
if (currentNode == null) {
currentNode = findLastNode(); //currentNode <- 마지막 노드 지칭
currentNode.setNext(node); //currentNode.next = 삽입할 node 연결
}
}
else {
insertLast(node); //현재 node를 마지막 노드로 삽입
}
}
-->[추가한 메소드 (3)] : int deleteNode(String)
: 학생 이름 인수로 받아서, 해당 학생노드를 연결리스트에서 삭제
: 해당 학생 없을 경우 –1 반환
//기능 추가(3)_삭제: 학생 이름 입력받은 후 해당 학생 노드 삭제 메소드
public int deleteNode(String name) {
if (this.head.getName().equals(name)) { //만약 head.name == 매개값 name인 경우
this.head = this.head.getNext(); // head의 next노드를 head로 업데이트
return 0; //종료
}
Node currentNode = this.head; //head부터 순회하며 현재 노드 지칭할 노드
int deletedIndex = -1; //삭제 위치 지정 변수 –1 초기화
if (currentNode != null) {
while (currentNode != null) { //현재노드 null아닌 동안 반복하면서
if (currentNode.getName().equals(name)) { //매개값 name과 같은 노드 찾으면
deletedIndex = getIndex(name); //name가진 노드의 위치 찾고
Node prevNode = this.head; //head부터 순회할 노드
//삭제 직전위치까지 for 돌면서 삭제 직전 노드 찾음
for (int i = 0; i < deletedIndex - 1; i++) {
prevNode = prevNode.getNext();
}
prevNode.setNext(currentNode.getNext());//직전노드.next <- 삭제노드.next
break;
}
currentNode = currentNode.getNext();//next따라 다음 노드로 이동하며 while반복
}
}
return deletedIndex; //해당 학생 찾지 못한 경우 –1 반환
}
-->[추가한 메소드 (4)] : void showAll()
: 전체 연결리스트 순회하며 모든 노드의 (이름,성적) 출력
//전체 순회하며 리스트 전체 출력 메소드
public void showAll() {
if (head == null) //만약 head가 null이면 공백 리스트
System.out.println("연결리스트 내부에 node 객체 없는 상태");
else { //공백 리스트 아닌 경우,
Node n = head; //head부터 순회할 노드 n
do {
System.out.print("(" + n.getName() + "," + n.getPointSum() + ") -> ");
n = n.getNext(); //next따라 다음 노드로 이동
}while (n != null); // 노드 n이 null 아닌 동안 반복
}
}
728x90
'Java > [학교] Java_GUI' 카테고리의 다른 글
[과제] 자바_GUI_긴문자열에서 숫자만 추출해오기 (0) | 2021.12.12 |
---|---|
[과제] 자바_GUI_ 소수 판별 및 출력 (0) | 2021.12.12 |
자바_프로젝트_스윙_(리듬게임) (0) | 2021.12.12 |
ch12. 스윙 컴포넌트들 (0) | 2021.10.05 |
ch11. 그래픽 프로그래밍 (0) | 2021.09.28 |