본문 바로가기

전산 기초/자료구조

[자료구조/java] 다항식의 연결 자료구조 표현


 

* 다항식의 연결 자료구조 표현 


- 단순 연결 리스트를 이용하여 다항식 표현하기

- 계수, 지수, 다음노드를 가리키는 참조 노드 세개로 구성

 


[다항식의 단순 연결 리스트 표현]

 

단순 연결 리스트를 이용하여 다항식을 표현 하였다.

단순 연결 리스트는 data, next 두개의 멤버변수로만 구성했지만

다항식을 표현한 단순연결리스트는 계수(coef)와 지수(expo), 다음노드를 가리키는 next 노드로 구성하였다.

 

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
ListNode.java
 
package polynomial;
 
public class ListNode {
    int coef;
    int expo;
    ListNode next;
    
    public ListNode() {
        next = null;
    }
    
    public ListNode(int coef, int expo){
        this.coef = coef;
        this.expo = expo;
        this.next = null;
    }
    
    public ListNode(int coef, int expo, ListNode next){
        this.coef = coef;
        this.expo = expo;
        this.next = next;
    }
    
    public int getCoef() {
        return this.coef;
    }
    
    public int getExpo() {
        return this.expo;
    }
}

 


 

[ 다항식 항 삽입 연산 ]

- 연결 리스트의 마지막 노드 다음에 새로운 노드 추가


if 리스트가 비어있는 경우 (head==null)

삽입하는 노드가 리스트의 첫번째 노드이자 마지막노드

리스트에 새로운 노드를 추가하고, 첫번째 노드로 지정

 

else 리스트가 비어있지 않은 경우 (head!=null) 

새로운 노드를 마지막 노드로 추가


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Polynomial.java
 
package polynomial;
 
public class Polynomial {
    ListNode head;
    
    public Polynomial() {
        head = null;
    }
    
    public void insertNode(int coef, int expo){
        ListNode node = new ListNode(coef, expo);
        if(head==null){
            head = node;
        }else{
            ListNode current = head;
            while(current.next!=null){
                current = current.next;
            }
            current.next = node;
        }
    }
    
    public void print(){
        if(head==null){
            System.out.println("출력할 노드가 존재하지 않습니다.");
        }else{
            ListNode current = head;
            while(current.next!=null){
                System.out.print(current.coef + "X^" + current.expo + " + ");
                current = current.next;
            }
            System.out.print(current.coef + "X^" + current.expo);
            System.out.println();
        }
    }
}

 

 

 

[ 다항식끼리 덧셈 연산 ]

- 새로운 리스트를 만들어 더해진 값들을 저장하고 연결한다.


if 다항식 B(x) 항의 지수가 더 큰 경우 (A.expo < B.expo) 

다항식 B의 현재 노드를 새로운 다항식 C의 값에 저장한다.


else if 다항식 A(x) 항의 지수가 더 큰 경우 (A.expo > B.expo)

다항식 A의 현재 노드를 새로운 다항식 C의 값에 저장한다.


else 두 항의 지수가 같은 경우 (A.expo == B.expo) 

다항식 A와 B의 계수(coef)를 더한 후 새로운 다항식 C의 값에 저장한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Test.java
 
package polynomial;
 
public class Test {
    public static void main(String[] args) {
        //다항식 A 만들기
        Polynomial A = new Polynomial();
        A.insertNode(4, 3);
        A.insertNode(3, 2);
        A.insertNode(5, 1);
        A.print();
 
        //다항식 B 만들기
        Polynomial B = new Polynomial();
        B.insertNode(3, 4);
        B.insertNode(1, 3);
        B.insertNode(2, 1);
        B.insertNode(1, 0);
        B.print();
 
        Polynomial C = AddPolynomial(A, B);
        C.print();
    }
 
    static Polynomial AddPolynomial(Polynomial A, Polynomial B){
        ListNode a = A.head;
        ListNode b = B.head;
        Polynomial C = new Polynomial();
 
        //A나 B 둘 중 하나가 모든 항에 대해 덧셈이 끝나는 경우 while 종료
        while(a!=null && b!=null){
            //B의 지수가 A의 지수보다 큰 경우
            if(a.expo<b.expo){
                C.insertNode(b.coef, b.expo);
                b = b.next;
            }
            //A의 지수가 B의 지수보다 큰 경우
            else if(a.expo>b.expo){
                C.insertNode(a.coef, a.expo);
                a = a.next;
            }
            //A의 지수와 B의 지수가 같은 경우
            else{
                C.insertNode(a.coef+b.coef, a.expo);
                a = a.next;
                b = b.next;
            }
        }    
        
        //A에 항이 남아 있는 경우 C에 추가
        while(a!=null){
            C.insertNode(a.coef, a.expo);
            a = a.next;
        }
        
        //B에 항이 남아 잇는 경우 B에 추가
        while(b!=null){
            C.insertNode(b.coef, b.expo);
            b = b.next;
        }
        
        return C;
    }
}


Test.java 에서 다항식 두개를 생성하고,

더해주는 연산을 제공해주는 AddPolynomial 메서드를 구현하였다.


[출력값]