주소 포인터를 이용한 다항식 계산
#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);
}
결과 :