리그캣의 개발놀이터

자료구조 - 다항식 리스트 퀴즈1(C언어) 본문

프로그래밍 기본/자료구조

자료구조 - 다항식 리스트 퀴즈1(C언어)

리그캣 2018. 1. 21. 16:56

다항식 리스트 퀴즈1


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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <stdio.h>
#include <stdlib.h>
 
 
typedef struct ListNode{            //다항식 리스트의 노드 구조 정의
    float coef;
    int expo;
    struct ListNode *link;
}ListNode;
 
typedef struct ListHead{            //다항식 리스트의 헤더 노드 구조 정의
    ListNode *head;
}ListHead;
 
ListHead *createLinkedList(void)    //공백 다항식 리스트 생성 연산
{
    ListHead *L;
    L=(ListHead *)malloc(sizeof(ListHead));
    L->head=NULL;
    return L;
}
 
void addLastNode(ListHead *L,float coef, int expo)//다항식 리스트에 마지막 노드 삽입 연산
{
    ListNode *newNode;
    ListNode *p;
    newNode = (ListNode *)malloc(sizeof(ListNode));
    newNode->coef=coef;
    newNode->expo=expo;
    newNode->link=NULL;
    if(L->head==NULL){        //현재 다항식 리스트가 공백인 경우,
        L->head=newNode;
        return;
    }
    else                    //현재 다항식 리스트가 공백이 아닌경우,
    {
        p=L->head;
        while(p->link!=NULL){    //라스트의 마지막 노드를 찾아서
            p=p->link;
        }
        p->link=newNode;            //현재의 마지막 노드 뒤에 새 노드를 연결한다.
    }
}
 
void addPoly(ListHead *A, ListHead *B, ListHead *C)            //두 다항식의 합을 구하는 연산
{
    ListNode *pA=A->head;
    ListNode *pB=B->head;
    float sum;
 
    while(pA&&pB){            //두다항식에 노드가 있는 동안 반복 수행
        if(pA->expo==pB->expo){        //다항식 A의 지수가 다항식 B의 지수와 같은 경우
            sum=pA->coef+pB->coef;
            addLastNode(C,sum,pA->expo);
            pA=pA->link,pB=pB->link;
        }
        else if(pA->expo>pB->expo){    //다항식 A의 지수가 다항식 B의 지수보다 큰 경우
            addLastNode(C,pA->coef,pA->expo);
            pA=pA->link;
        }
        else if(pA->expo<pB->expo){    //다항식 B의 지수가 다항식 A의 지수보다 큰 경우
            addLastNode(C,pB->coef,pB->expo);
            pB=pB->link;
        }
    }
    for(;pA!=NULL;pA=pA->link)
        addLastNode(C,pA->coef,pA->expo);
    for(;pB!=NULL;pB=pB->link)
        addLastNode(C,pB->coef,pB->expo);
}
 
void minusPoly(ListHead *A, ListHead *B, ListHead *C)            //두 다항식의 합을 구하는 연산
{
    ListNode *pA=A->head;
    ListNode *pB=B->head;
    float minus1,minus2;
 
    while(pA&&pB){            //두다항식에 노드가 있는 동안 반복 수행
        if(pA->expo==pB->expo){        //다항식 A의 지수가 다항식 B의 지수와 같은 경우
            if((pA->coef)>(pB->coef))
            {
                minus1=(pA->coef)-(pB->coef);
                addLastNode(C,minus1,pA->expo);
                pA=pA->link,pB=pB->link;
            }
            else if((pA->coef)<(pB->coef))
            {
                minus2=(pB->coef)-(pA->coef);
                addLastNode(C,minus2,pB->expo);
                pA=pA->link,pB=pB->link;
            }
            else{
                pA=pA->link,pB=pB->link;
            }
        }
        else if(pA->expo>pB->expo){    //다항식 A의 지수가 다항식 B의 지수보다 큰 경우
            addLastNode(C,pA->coef,pA->expo);
            pA=pA->link;
        }
        else if(pA->expo<pB->expo){    //다항식 B의 지수가 다항식 A의 지수보다 큰 경우
            addLastNode(C,-(pB->coef),pB->expo);
            pB=pB->link;
        }
    }
    for(;pA!=NULL;pA=pA->link)
        addLastNode(C,pA->coef,pA->expo);
    for(;pB!=NULL;pB=pB->link)
        addLastNode(C,-(pB->coef),pB->expo);
}
 
void printPoly(ListHead *L)        //다항식 리스트를 출력하는 연산
{
    ListNode *p=L->head;
    for(;p;p=p->link){
        printf("%3.0fx^%d",p->coef,p->expo);
    }
}
 
 
void main(void){
    ListHead *A,*B,*C,*D;
 
    A=createLinkedList();            //공백 다항식 리스트 A,B,C 생성하기
    B=createLinkedList();
    C=createLinkedList();
    D=createLinkedList();
 
    addLastNode(A,4,3);                //다항식 리스트 A에 4x^3 노드 추가
    addLastNode(A,3,2);                //다항식 리스트 A에 3x^2 노드 추가
    addLastNode(A,5,1);                //다항식 리스트 A에 5x^1 노드 추가
    printf("\n A(x)=");
    printPoly(A);                    //다항식 리스트 A 출력하기
 
    addLastNode(B,3,4);                //다항식 리스트 B에 3x^4 노드 추가
    addLastNode(B,1,3);                //다항식 리스트 B에 1x^3 노드 추가
    addLastNode(B,2,1);                //다항식 리스트 B에 2x^1 노드 추가
    addLastNode(B,1,0);                //다항식 리스트 B에 1x^0 노드 추가
    printf("\n B(x)=");
    printPoly(B);                    //다항식 리스트 B 출력하기
 
    addPoly(A,B,C);                    //다항식의 덧셈 연산 수행
    printf("\n C(x)=");
    printPoly(C);                    //다항식 리스트 C출력하기
 
    minusPoly(C,A,D);
    printf("\n D(x)=");
    printPoly(D);
    getchar();
}
 
cs


Comments