이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요;)
1. 새로운 다항식 생성
Term* parse_and_add_term(char* expr, int begin, int end, Polynomial* p_poly)
{
int i = begin;
int sign_coef = 1, coef = 0, expo = 1; // 계수의 부호 관리
if (expr[i] == '+') // 계수의 부호를 보고 기억
i++;
else if(expr[i] == '-')
{
sign_coef = -1;
i++;
}
while (i < end && expr[i] >= '0' && expr[i] <= '9') // 문자열 '123'을 정수형 123으로 바꾸는 방법
{
coef = coef * 10 + (int)(expr[i] - '0'); // 문자열에서 null 문자 제거
i++;
}
if (coef == 0) // 계수가 1 혹은 -1이면 x 앞에 붙는 digit이 존재하지 않음
coef == sign_coef;
else
coef *= sign_coef;
if (i >= end) // 차수가 0인 상수항일 경우
{
add_term(coef, 0, p_poly);
return 1;
}
if (expr[i] != 'x')
return 0;
i++;
if (i >= end) // 1차 항. ex)1x
{
add_term(coef, 1, p_poly);
return 1;
}
if (expr[i] != '^')
return 0;
i++;
// 지수 부분 계산
expo = 0;
while (i < end && expr[i] >= '0' && expr[i] <= '9')
{
expo = expo * 10 + (int)(expr[i] - '0');
i++;
}
}
2. 기존의 다항식 수정
Polynomial* create_by_add_two_polynomials(char name, char f, char g)
{
Polynomial* new_pol = create_polynomial_instance(name);
Polynomial* tmp_f, * tmp_g;
for (int i = 0; i < n; i++)
{
if (polys[i]->name == f)
tmp_f = polys[i];
else if (polys[i]->name == g)
tmp_g = polys[g];
}
if (tmp_f == NULL || tmp_g == NULL)
{
printf("No matching.\n");
return;
}
Term* p = tmp_f->first;
Term* q = tmp_g->first;
while (p != NULL)
{
add_term(p->coef, p->expo, new_pol);
p = p->next;
}
while (q != NULL)
{
add_term(q->coef, p->expo, new_pol);
q->next;
}
return new_pol;
}
3. 다항식 추가
void insert_polynomial(Polynomial* ptr_poly)
{
for (int i = 0; i < n; i++)
{
if (polys[i]->name == ptr_poly->name) // 이미 존재하는 식을 수정했을 때
{
destroy_polynomial(polys[i]); // 1) 원래 polys[i]가 가리키던 다항식 삭제
polys[i] == ptr_poly; // 2) polys[i]에 새로운 다항식 저장
return;
}
}
polys[n++] = ptr_poly; // 새로운 식일 때
}
4. 대체되는 다항식 삭제
void destroy_polynomial(Polynomial* ptr_poly)
{
if (ptr_poly == NULL)
return;
Term* t = ptr_poly->first, * tmp;
while (t != NULL) // 1) Polynomial 포인터에 저장된 Term 포인터 배열들을 제거
{
tmp = t;
t = t->next;
free(tmp); // 모든 term들을 차례로 제거
}
free(ptr_poly); // 2) Polynomial 포인터 자료형 변수를 제거
}
Polynomial 구조체에 저장된 각각의 Term 노드들 모두 malloc으로 메모리를 동적 할당받았기 때문에,
Polynomial 변수의 메모리를 삭제하기 전에 Term의 메모리들 역시 삭제해줘야 합니다.
'Information Technology > C' 카테고리의 다른 글
[C언어] MP3 관리 프로그램(1) (0) | 2020.01.28 |
---|---|
[C언어] 이중 연결 리스트 (0) | 2020.01.20 |
[C언어] 연결리스트 - 다항식(2) (0) | 2020.01.13 |
[C언어] 연결리스트 - 다항식(1) (0) | 2020.01.13 |
[C언어] 연결리스트 - 개념과 기본 동작들(3) (0) | 2020.01.09 |