별의 공부 블로그 🧑🏻‍💻
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 *= plist1->head;
    ListNode *= 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 *= 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, 312);
    insert_node_last(&list1, 28);
    insert_node_last(&list1, 10);
 
    // 다항식 2를 생성
    insert_node_last(&list2, 812);
    insert_node_last(&list2, -310);
    insert_node_last(&list2, 106);
 
    // 다항식 3 = 다항식 1 + 다항식 2
    poly_add(&list1, &list2, &list3);
    poly_print(&list3);
}
cs

코드 출처 : C언어로 쉽게 풀어쓴 자료구조 (천인국 외 지음, 생능출판사)


728x90
그리드형(광고전용)
⚠️AdBlock이 감지되었습니다. 원할한 페이지 표시를 위해 AdBlock을 꺼주세요.⚠️
starrykss
starrykss
별의 공부 블로그 🧑🏻‍💻


📖 Contents 📖