자료구조

자료구조) 연결 리스트로 구현한 다항식 덧셈 프로그램

쫑드기 2020. 6. 2. 23:14

<들어가기에 앞서>

c언어로 작성되었습니다.

 

<프로그램 개요>

다항식 2개를 준비하여 다항식끼리 더한 결과 값을 다항식으로 출력합니다. 

 

 

<소스 코드>

 

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
115
116
117
118
 
#include <stdio.h>
#include <stdlib.h>_dbdao.h
 
typedef struct ListNode
{
    int coef;
    int expon;
    struct ListNode *link;
} ListNode;
 
typedef struct ListType
{
    int size;
    ListNode *head;
    ListNode *tail;
} ListType;
 
void error(char *message)
{
    fprintf(stderr,"%s\n",message);
    exit(1);
}
 
ListType *create()
{
    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 *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->size++;
}
 
void poly_add(ListType *plist1, ListType *plist2, ListType *plist3)
{
    ListNode *= plist1->head;
    ListNode *= plist2->head;
    int sum;
 
    while (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
        {
            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 *= plist->head;
 
    printf("polynomial = ");
    for (; p != NULL; p = p->link)
        printf("%d^%d + ",p->coef,p->expon);
    puts("");
}
 
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;
}
cs

 

 

<그림>

void insert_last(ListType *plist,int coef, int expon); 함수의 이해가 쉽게 되지 않아 그림으로 그려보았습니다. 

 

1) *plist의 초기 상태입니다. 

 

 

 

2) void insert_last(ListType *plist, int coef, int expon) 함수가 한 번 실행된 상태입니다. 

 

 

 

 

3) void insert_last(ListType *plist, int coef, int expon) 함수가 두 번 실행된 상태입니다.

 

 

 

4) void insert_last(ListType *plist, int coef, int expon) 함수가 여러 번 실행되다 보면 결국 이런 식으로 노드들이 뻗어 나갈 것입니다. 

 

 

 

틀린 부분 있으면 피드백 부탁드립니다.

감사합니다. 좋은 하루 보내세요~!