코드를 확인하시고 공부하시는대에 도움이 되셨으면 좋겠습니다
더보기
#include <stdio.h>
#include <stdlib.h>
typedef struct listNode *node_p;
struct listNode {
int coef;
int exp;
node_p link;
};
node_p appendTerm(node_p poly, int c, int e, node_p *last);
node_p addLastNode(node_p L, int c, int e);
node_p inputTerm();
void printTerm(node_p p);
node_p polyAdd(node_p A, node_p B);
node_p polyMult(node_p A, node_p B);
node_p appendTerm(node_p poly, int c, int e, node_p *last)//삽입
{ // return 값이 있기때문에 사용할때는 c = appendTerm(c, --, --, &r)
// poly만 return을 하기 때문에, last는 포인터로 "참조"해서 사용한다.)
node_p newNode;
newNode = (node_p)malloc(sizeof(struct listNode));
newNode->exp = e;//지수
newNode->coef = c;//계수
if ( poly == NULL ) {
poly = newNode;//첫 노드
*last = newNode;//다음노드
}
else {
(*last)->link = newNode; //다음 newnode를 카리킴
*last = newNode;//다음 노드로 이동
}
(*last)->link = NULL;//노드의 마지막값이 NULL을 가리킴
return poly;
}
node_p addLastNode(node_p L, int c, int e)//L에 지수와 계수를 만들어 넣음
{
node_p newNode, p;
newNode = (node_p)malloc(sizeof(struct listNode));
newNode->coef = c;
newNode->exp = e;
newNode->link = NULL;
if (L == NULL) {
L = newNode;
return L;
}
p = L;
while (p->link != NULL)
p = p->link;
p->link = newNode;
return L;
}
node_p polyAdd(node_p A, node_p B)//두 다항식을 더함
{
int sum; // 지수값이 같을 때 두 다항식의 계수를 저장할 변수
node_p p;//A버퍼
node_p q;//B버퍼
node_p r;
node_p C;
p = A;
q = B;
r = NULL; // 결과 다항식의 마지막 노드를 지시
C = NULL; // 결과 다항식
while ( p != NULL && q != NULL ) { // p, q는 순회 포인터
if ( p->exp == q->exp ) {
sum = p->coef + q->coef;
if ( sum != 0 ) {
C = appendTerm(C, sum, p->exp, &r);//C에 값을 넣음!
}
p = p->link;//다음p(A)
q = q->link;//다음q(B)
}
else if ( p->exp < q->exp ) {
C = appendTerm(C, q->coef, q->exp, &r);
q = q->link;
}
else if ( p->exp > q->exp ) {
C = appendTerm(C, p->coef, p->exp, &r);
p = p->link;
} // end if-else if
} // end while
while ( p != NULL ) {//A남은거있음 다출력!
C = appendTerm(C, p->coef, p->exp, &r);
p = p->link;
}
while ( q != NULL ) {
C = appendTerm(C, q->coef, q->exp, &r);
q = q->link;
}
r->link = NULL;
return C;
}
node_p polyMult(node_p A, node_p B)
{
node_p p;// 다항식 A의 순회포인터
node_p q;// 다항식 B의 순회포인터
node_p r;// appendTerm 마지막노드 포인터
node_p C;// 결과 다항식
node_p result; // 임시 저장
q = B; //B 를 내비둠
C = NULL;
while ( q != NULL ) {
p = A;//A를 초기화
r = NULL;
result = NULL;
while ( p != NULL ) {
result = appendTerm(result, p->coef*q->coef, p->exp+q->exp, &r);
C = polyAdd(C, result);
p = p->link;//A감소
result = NULL;//다시 값 받아주기위해 초기화
}
q = q->link;//B감소
}
return C;
}
node_p inputTerm()
{
node_p p = NULL;
int coef, exp;
do{
printf(" 계수와 지수 입력 (종료시는 -1 -1 입력) : ");
scanf("%d %d", &coef, &exp);
if (exp != -1) p = addLastNode(p, coef, exp);//지수에 -1 값을 입력받을때까지 add
}while (coef != -1 && exp != -1);
return p;
}
void printTerm(node_p p)
{
while (p != NULL) {//널이돼면 끝
printf("%dx^%d", p->coef, p->exp);
p = p->link;//다음 링크
if (p != NULL && p->coef > 0) printf("+");
}
printf("\n");
}
void main()
{
node_p p1, p2, p3;
printf("p1 입력\n");
p1 = inputTerm();
printf("p2 입력\n");
p2 = inputTerm();
printf("p1 = ");
printTerm(p1);
printf("p2 = ");
printTerm(p2);
p3 = polyAdd(p1, p2);
printf("\n다항식 덧셈 결과 : \np3 =");
printTerm(p3);
p3 = polyMult(p1, p2);
printf("\n다항식 곱셈 결과 : \np3 =");
printTerm(p3);
getchar();
}
더 많은 C언어 글이 궁금하다면?
https://chuinggun.tistory.com/category/C%EC%96%B8%EC%96%B4
'C언어' 카테고리의 다른 글
[C언어] 2진탐색트리 이진탐색트리를 작성하시오 (0) | 2022.12.03 |
---|---|
[C언어] 단순연결리스트를 작성하시오 (0) | 2022.12.03 |
[C언어] 버블정렬, 거품정렬의 오름차순, 내림차순 프로그램을 작성하시오 (0) | 2022.12.02 |
[C언어] 로또추첨기, 당첨기를 작성하시오 (0) | 2022.12.02 |
[C언어] 변수 두 개를 나누고 값을 반환하는 division(int a, int b)함수를 작성하시오 (0) | 2022.12.01 |
댓글