-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path연결리스트로 구현한 다항식덧셈.c
114 lines (97 loc) · 2.35 KB
/
연결리스트로 구현한 다항식덧셈.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <stdio.h>
#include <stdlib.h>
typedef struct listnode{ //단순히 식을가지고있는리스트
int coef; //계수
int expon; //지수
struct listnode *link;
}Listnode;
typedef struct listtype{ //식을가르키는 리스트를 가르키는 헤더노드
int size;
Listnode *head;
Listnode *tail;
}Listtype;
Listtype * create(void)
{
Listtype * plist = (Listtype *)malloc(sizeof(Listtype));
plist->size = 0;
plist->head = plist->tail = NULL;
return plist;
}
void insert_last(Listtype *plist, int coef, int expon)
{
Listnode * tmp = (Listnode *)malloc(sizeof(Listnode));
tmp->coef = coef;
tmp->expon = expon;
tmp->link = NULL;
if(plist->tail == NULL) //리스트가 비어있을때
plist->head = plist->tail = tmp;
else
{
plist->tail->link = tmp; //헤더노드의 테일이 가르키는 즉 식이들어있는 마지막노드가 가르키는 값에다가 tmp의 주소를 입력
plist->tail = tmp; //헤더노드의 테일이 tmp를 가르키도록 입력 이런식으로 하지않으면 테일은 여전히 추가하기전의 마지막노드를 가르키고있음
}
plist->size++;
}
void poly_add(Listtype *plist1, Listtype *plist2, Listtype *plist3)
{
Listnode *a = plist1->head;
Listnode *b = plist2->head;
int sum;
while(a != NULL && b != NULL) //a와b가 둘다 널이아닐때? 하나라도 널이라면 종료
{
if(a->expon == b->expon)
{
sum = a->coef + b->coef;
if(sum != 0)
{
insert_last(plist3, sum, a->expon);
a = a->link;
b = b->link;
}
}
else if(a->expon > b->expon)
{
insert_last(plist3, a->coef, a->expon);
a = a->link;
}
else if(a->expon < b->expon)
{
insert_last(plist3, b->coef, b->expon);
b = b->link;
}
}
//둘중 하나가 남았을때 진행
for(; a != NULL; a = a->link)
insert_last(plist3, a->coef, a->expon);
for(; b != NULL; b = b->link)
insert_last(plist3, b->coef, b->expon);
}
void poly_print(Listtype *plist)
{
Listnode *p = plist->head;
printf("다항식 = ");
for(; p; p = p->link) //p가 널이아닐때까지반복
printf("%d^%d + ", p->coef, p->expon);
printf("\n");
}
int main(void)
{
Listtype *list1, *list2, *list3;
list1 = create();
list2 = create();
list3 = create();
insert_last(list1, 3, 12);
insert_last(list1, 2, 8);
insert_last(list1, 1, 0);
insert_last(list2, 8, 12);
insert_last(list2, -3, 10);
insert_last(list2, 10, 6);
poly_print(list1);
poly_print(list2);
poly_add(list1, list2, list3);
poly_print(list3);
free(list1);
free(list2);
free(list3);
return 0;
}