본문 바로가기

Information Technology/C

[C언어] 연결리스트 - 다항식(3)

이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요;)


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의 메모리들 역시 삭제해줘야 합니다.