C/자료구조

주소 포인터를 이용한 다항식 계산

NationCore 2019. 3. 18. 22:13

#include <stdio.h>

#include <stdlib.h>


typedef struct ListNode {

int coef;

int expon;

struct ListNode *link;

} ListNode;


typedef struct ListHeader {

int length;

ListNode *head;

ListNode *tail;

}ListHeader;


void init(ListHeader *list)

{

list->length = 0;

list->tail = list->head = NULL;

}


void error(char *mes)

{

fprintf(stderr, "%s\n", mes);

exit(1);

}



void insert_node(ListHeader *list, int coef, int expon)

{

ListNode *p = (ListNode *)malloc(sizeof(ListNode));

if (p == NULL) error("메모리 할당 에러");

p->coef = coef;

p->expon = expon;

p->link = NULL;


if (list->head == NULL) { list->head = list->tail = p; }

else {

list->tail->link = p;

list->tail = p;

}

list->length++;

}


void poly_add(ListHeader *list1, ListHeader *list2, ListHeader *list3)

{

ListNode *a = list1->head;

ListNode *b = list2->head;


int sum;


while (a && b) //한쪽 포인터 주소가 NULL이 나올때까지

{

if (a->expon == b->expon)

{

sum = a->coef + b->coef;

if (sum != 0) insert_node(list3, sum, a->expon);

a = a->link; b = b->link;

}

else if (a->expon > b->expon) {

insert_node(list3, a->coef, a->expon);

a = a->link;

}

else {

insert_node(list3, b->coef, b->expon);

b = b->link;

}

}


//남은 항 모두 결과 주소로 복사

for (; a != NULL; a = a->link)

insert_node(list3, a->coef, a->expon);

for (; b != NULL; b = b->link)

insert_node(list3, b->coef, b->expon);


}


void poly_sub(ListHeader *list1, ListHeader *list2, ListHeader *list3)

{

ListNode *a = list1->head;

ListNode *b = list2->head;


int sum;


while (a && b)

{

if (a->expon == b->expon)

{

sum = a->coef - b->coef;

if (sum != 0) insert_node(list3, sum, a->expon);

a = a->link; b = b->link;

}

else if(a->expon > b->expon)

{

insert_node(list3, a->coef, a->expon);

a = a->link;

}

else

{

insert_node(list3, b->coef, b->expon);

b = b->link;

}

}


for (;a != NULL; a = a->link)

insert_node(list3, a->coef, a->expon);

for (;b != NULL; b = b->link)

insert_node(list3, b->coef, b->expon);

}


void display(ListHeader *list)

{

ListNode *p = list->head;

for (;p;p=p->link){ printf("x의 계수%d 차수: %d\n", p->coef, p->expon); }

}


void main()

{

ListHeader list1, list2, list3;


init(&list1);

init(&list2);

init(&list3);


insert_node(&list1, 3, 12);

insert_node(&list1, 2, 8);

insert_node(&list1, 1, 0);


insert_node(&list2, 8, 12);

insert_node(&list2, -3, 10);

insert_node(&list2, 10, 6);


poly_add(&list1, &list2, &list3);

printf("더한 값의 결과 \n");

display(&list3);

init(&list3);

poly_sub(&list1, &list2, &list3);

printf("뺄셈 값의 결과 \n");

display(&list3);

}




결과 :