728x90
728x170
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 ListHeader {
int length;
ListNode *head;
ListNode *tail;
} ListHeader;
// 초기화 함수
void init(ListHeader *plist) {
plist->length = 0;
plist->head = plist->tail = NULL;
}
// 오류 처리 함수
void error(char *message) {
fprintf(stderr, "%s\n", message);
exit(1);
}
// plist는 연결 리스트의 헤더를 가리키는 포인터, coef는 계수, expon은 지수
void insert_node_last(ListHeader *plist, int coef, int expon) {
ListNode *temp = (ListNode *)malloc(sizeof(ListNode));
if (temp == NULL) error("메모리 할당 에러");
temp->coef = coef;
temp->expon = expon;
temp->link = NULL; // 마지막 노드 이므로
if (plist->tail == NULL) { // 공백 리스트
plist->head = plist->tail = temp;
}
else {
plist->tail->link = temp;
plist->tail = temp;
}
plist->length++;
}
// list3 = list1 + list2
void poly_add(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3) {
ListNode *a = plist1->head;
ListNode *b = plist2->head;
int sum;
while (a != NULL && b != NULL) {
if (a->expon == b->expon) { // a의 차수 == b의 차수
sum = a->coef + b->coef;
if (sum != 0) insert_node_last(plist3, sum, a->expon);
a = a->link;
b = b->link;
}
else if (a->expon > b->expon) { // a의 차수 > b의 차수
insert_node_last(plist3, a->coef, a->expon);
a = a->link;
}
else { // a의 차수 < b의 차수
insert_node_last(plist3, b->coef, b->expon);
b = b->link;
}
}
// a나 b 중의 하나가 먼저 끝나게 되면 남아 있는 항들을 모두
// 결과 다항식으로 복사
if (a != NULL) {
for (; a != NULL; a = a->link) {
insert_node_last(plist3, a->coef, a->expon);
}
}
if (b != NULL) {
for (; b != NULL; b = b->link) {
insert_node_last(plist3, b->coef, b->expon);
}
}
}
// 다항식 출력 함수
void poly_print(ListHeader *plist) {
ListNode *p = plist->head;
for (; p; p = p->link) {
printf("%d %d\n", p->coef, p->expon);
}
}
// 이중 연결 리스트의 응용 테스트 프로그램
void main() {
ListHeader list1, list2, list3;
// 연결 리스트의 초기화
init(&list1);
init(&list2);
init(&list3);
// 다항식 1을 생성
insert_node_last(&list1, 3, 12);
insert_node_last(&list1, 2, 8);
insert_node_last(&list1, 1, 0);
// 다항식 2를 생성
insert_node_last(&list2, 8, 12);
insert_node_last(&list2, -3, 10);
insert_node_last(&list2, 10, 6);
// 다항식 3 = 다항식 1 + 다항식 2
poly_add(&list1, &list2, &list3);
poly_print(&list3);
} |
cs |
코드 출처 : C언어로 쉽게 풀어쓴 자료구조 (천인국 외 지음, 생능출판사)
728x90
그리드형(광고전용)
'Source Code > C' 카테고리의 다른 글
중위 표기 수식을 후위 표기 수식으로 변환하는 프로그램 (0) | 2017.05.16 |
---|---|
후위 표기식 계산 프로그램 (5) | 2017.05.16 |
괄호 검사 프로그램 (0) | 2017.05.11 |
연결 리스트로 구현된 리스트 ADT 테스트 프로그램 (0) | 2017.05.08 |
별 찍기 (Asterisk Decoration) in C (0) | 2017.05.03 |
Multiplication Tables (9X9, 18X18) in C (0) | 2017.04.26 |
Numbers in Ascending/Descending Order with using Recrusion in C (0) | 2017.04.17 |
Sum of Numbers in Ascending/Descending Order with using Recursion in C (0) | 2017.04.17 |