본문 바로가기
C언어

[C언어] 연결리스트를 연산하는 프로그램을 작성하세요

by 이얏호이야호 2022. 12. 3.

코드를 확인하시고 공부하시는대에 도움이 되셨으면 좋겠습니다 

더보기
#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

 

댓글