B2조 자료구조
   과제 보고서
[ Project #3 : 다항식 계산 ]




                     조장 : 최완철
                     조원 : 고충욱
                          강승우
                          정준용
                          김남희
과제수행일지
  소속                                            조원

  B2           조장 : 최완철              자료조사 : 강승우, 김남희          프로그래밍 : 고충욱, 정준용

과제수행기간                                          3일

                                  I. 계획의 작성

 연구제목     Linked List



          학습한 내용에 대해 이해를 하고, Linked List의 정의를 알고,
 연구배경
          이것을 프로그램으로 만들어 봄으로써 활용법을 안다.




                        http://ko.wikipedia.org/wiki/%EB%A7%81%ED%81%AC%EB%93%9C_
                        %EB%A6%AC%EC%8A%A4%ED%8A%B8
 참고자료     참고 URL        -> 링크드 리스트의 정의와 종류
                        http://blog.naver.com/skout123?Redirect=Log&logNo=50134180161
                        -> 연결리스트와 용어에 대한 설명, 사진 (본문에 포함)




                                  II. 계획의 실행

 첫째 날                                 2012년 4월 12일 목요일

오늘의 작업                                 계획수립 및 역할 분담

         조장 : 최완철
         자료조사 : 강승우, 김남희
         프로그래밍 : 고충욱, 정준용
토의 내용
         위와 같이 조원의 업무 분담을 하였으며, 3번째 과제와 관련된 링크드 리스트에 대한 자
         료조사를 최우선적으로 하기로 했다.
         그리고 역할 분담은 각자가 하고 싶은 역할 위주로 정하였다.


과제준비에서   첫날에 아무것도 모르는 상황이라서 토의 진행이 되지 않았었다.
 느낀 점    그 때문에 사전 자료조사의 중요성을 느끼게 되었다.
둘째 날                     2012년 4월 17일 화요일
오늘의 작업       링크드 리스트에 대한 자료를 이용하여 개념 이해 및 소스 구현방법 이해
         링크드 리스트 과제를 수행하기 위해서는 개념 이해가 중요하다고 느꼈다.
         그래서 자료조사팀에서 조사한 내용을 가지고 이해하였다.




토의 내용
과제준비에서   링크드 리스트의 개념과 구조를 알게 되었으나, 소스로 구현하게 된다면 예상하지 못한
 느낀 점    문제들이 발생할 것 같다고 느꼈다.




 셋째 날                                    2012년 4월 19일 목요일
오늘의 작업                                 소스 초안 확인 및 개선방향 설정

         소스초안에서는 다항식 연산에서 덧셈과 뺄셈만 구현하였다.
         소스 초안의 연산 과정에 있어서 특별한 문제는 없었다.
토의 내용
         아직 곱셈과 나눗셈 연산은 구현하지 못했기 때문에 이 부분에 대해서 초안에 추가적으로
         구현을 하기로 하였다.

         곱셈 및 나눗셈 연산에서 지수가 같은 경우를 걸러내는 방법을 구현하는데 난관을 겪었
과제준비에서
         다.
 느낀 점
         곱셈과 나눗셈에 대한 더 많은 공부가 필요하다고 느끼게 되었다.

 넷째 날                                    2012년 4월 24일 화요일
오늘의 작업                                   프로그램 소스 초안 코딩
         #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 insert_node_last(ListHeader *plist, int coef, int expon)
{
    ListNode *temp = (ListNode *)malloc(sizeof(ListNode));
    if( temp == NULL ){
    fprintf(stderr,"메모리 할당 에러n");
    exit(1);
    }
    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++;
}


void poly_add(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 )
{
    ListNode *a = plist1->head;
    ListNode *b = plist2->head;
    int sum;
    while(a && b){
    if( a->expon == b->expon ){
    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 ){
    insert_node_last(plist3, a->coef, a->expon);
    a=a->link;
    }
    else {
    insert_node_last(plist3, b->coef, b->expon);
    b=b->link;
}
    }



 for( ; a != NULL; a=a->link)
insert_node_last(plist3, a->coef, a->expon);
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 %dn", p->coef, p->expon);
             }
         }


         main()
         {
             ListHeader list1, list2, list3;


             init(&list1);
             init(&list2);
             init(&list3);




         insert_node_last(&list1, 3,12);
          insert_node_last(&list1, 2,8);
             insert_node_last(&list1, 1,0);



         insert_node_last(&list2, 8,12);
             insert_node_last(&list2, -3,10);
             insert_node_last(&list2, 10,6);



             poly_add(&list1, &list2, &list3);
             poly_print(&list3);
         }


 문제점     덧셈 연산만 가능함

해결 방안    덧셈 연산을 응용하여 뺄셈 연산을 구현하고 곱셈 및 나눗셈 연산도 구현해야 함

다섯째 날                                            2012년 4월 25일 수요일
오늘의 작업                                     2안 소스 확인 및 개선 방향 설정
         #include <stdio.h>
         #include <stdlib.h>
         #include <math.h>
  2안
         typedef struct ListNode {
                      float coef;
                      int expon;
struct ListNode *link;
} ListNode;


typedef struct ListHeader {
             int length;
             ListNode *head;
             ListNode *tail;
} ListHeader;


void init(ListHeader *plist);
void free_poly(struct ListHeader *list);
void insert_node_last(ListHeader *plist, float coef, int expon);
void poly_add(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 );
void poly_sub(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 );
void poly_mul(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 );
void poly_op(ListHeader *plist);
void poly_print(ListHeader *plist);


main()
{
         ListHeader list1, list2, list3;
         int choice, a, i;
         init(&list1);
         init(&list2);
         init(&list3);


         printf("첫번째 다항식의 입력할 항 수를 정하시오");
         scanf("%d", &a);
         for(i=0; i<a; i++)
         {
                    float coef;
                    int expon;
                    printf("계수를 입력하시오.(실수) ");
                    scanf("%f", &coef);
                    printf("지수를 입력하시오.(정수) ");
                    scanf("%d", &expon);
                    insert_node_last(&list1, coef, expon);
         }


         printf("두번째 다항식의 입력할 항 수를 정하시오");
         scanf("%d", &a);
         for(i=0; i<a; i++)
         {
float coef;
               int expon;
               printf("계수를 입력하시오.(실수) ");
               scanf("%f", &coef);
               printf("지수를 입력하시오.(정수) ");
               scanf("%d", &expon);
               insert_node_last(&list2, coef, expon);
    }


    printf("1. 다항식 덧셈n");
    printf("2. 다항식 뺄셈n");
    printf("3. 다항식 곱셈n");
    printf("4. 1번다항식 연산n");
    printf("5. 2번다항식 연산n");
    printf("6. 끝내기nn");
    printf("원하는 항목을 선택하시오 : ");
    scanf("%d", &choice);
    if(choice==1)
    {
           poly_add(&list1, &list2, &list3);
           poly_print(&list3);
    }
    else if(choice==2)
    {
           poly_sub(&list1, &list2, &list3);
           poly_print(&list3);
    }
    else if(choice==3)
    {
           poly_mul(&list1, &list2, &list3);
           poly_print(&list3);
    }
    else if(choice==4)
           poly_op(&list1);
    else if(choice==5)
           poly_op(&list2);
    else if(choice==6)
           printf("감사합니다.");
    else
           printf("잘못입력하였습니다.");
    system("PAUSE");
}
void init(ListHeader *plist)
{
     plist->length = 0;
     plist->head = plist->tail = NULL;
}


void free_poly(struct ListHeader *list)
{
     free(list);
}


void insert_node_last(ListHeader *plist, float coef, int expon)
{
     ListNode *p = plist->head;
     ListNode *temp = (ListNode *)malloc(sizeof(ListNode));
     if( temp == NULL )
     {
            fprintf(stderr,"메모리 할당 에러n");
            exit(1);
     }
     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++;
}


void poly_add(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 )
{
     ListNode *a = plist1->head;
     ListNode *b = plist2->head;
     float sum;
     while(a && b)
     {
                if( a->expon == b->expon )
{
                    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 )
             {
                     insert_node_last(plist3, a->coef, a->expon);
                     a=a->link;
             }
             else
             {
                    insert_node_last(plist3, b->coef, b->expon);
                    b=b->link;
             }
     }
     for( ; a != NULL; a=a->link)
     insert_node_last(plist3, a->coef, a->expon);
     for( ; b != NULL; b=b->link)
     insert_node_last(plist3, b->coef, b->expon);
}


void poly_sub(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 )
{
     ListNode *a = plist1->head;
     ListNode *b = plist2->head;
     float sub;
     while(a && b)
     {
             if( a->expon == b->expon )
             {
                    sub = a->coef - b-> coef;
                    if( sub != 0 ) insert_node_last(plist3, sub, a->expon);
                    a=a->link; b=b->link;
             }
             else if( a->expon > b->expon )
             {
                     insert_node_last(plist3, a->coef, a->expon);
                     a=a->link;
             }
             else
             {
                    insert_node_last(plist3, b->coef, b->expon);
b=b->link;
                }
     }
     for( ; a != NULL; a=a->link)
     insert_node_last(plist3, a->coef, a->expon);
     for( ; b != NULL; b=b->link)
     insert_node_last(plist3, b->coef, b->expon);
}


void poly_mul(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 )
{
     ListNode *a = plist1->head;
     ListNode *b = plist2->head;
     ListNode *p = plist3->head;
     float mul_coef;
     int mul_expon;
     while(a)
     {
          while(b)
          {
                    mul_coef = a->coef * b->coef;
                    mul_expon = a->expon + b->expon;
                    insert_node_last(plist3, mul_coef, mul_expon);
                    b=b->link;
          }
          b=plist2->head;
          a=a->link;
     }
}


void poly_op(ListHeader *plist)
{
     ListNode *a = plist->head;
     float x,c,value=0;
     printf("x값을 입력하시오 : ");
     scanf("%f", &x);
     for(; a != NULL; )
     {
           c=pow(x,a->expon);
           c*=a->coef;
           value+=c;
           a=a->link;
     }
printf("%f",value);
          }


          void poly_print(ListHeader *plist)
          {
               ListNode *p=plist->head;
               for(;p;p=p->link)
               {
                      printf("%.3fx^%d ", p->coef, p->expon);
               }
               free_poly(plist);
          }


 문제점      다항식 곱셈연산에서 지수가 같은 항의 계수부분이 연산 되지 않음

                                          III. 결과

          #include <stdio.h>
          #include <stdlib.h>
          #include <math.h>


          typedef struct ListNode {
                   float coef;
                   int expon;
                   struct ListNode *link;
          } ListNode;


          typedef struct ListHeader {
                   int length;
                   ListNode *head;
최종 프로그램
                   ListNode *tail;
  소스
          } ListHeader;


          void init(ListHeader *plist);
          void free_poly(struct ListHeader *list);
          void insert_node_last(ListHeader *plist, float coef, int expon);
          void poly_add(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 );
          void poly_sub(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 );
          void poly_mul(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 );
          void poly_op(ListHeader *plist);
          void poly_print(ListHeader *plist);


          main()
          {
ListHeader list1, list2, list3;
int choice, a, i;
init(&list1);
init(&list2);
init(&list3);


printf("첫번째 다항식의 입력할 항 수를 정하시오");
scanf("%d", &a);
for(i=0; i<a; i++)
{
          float coef;
          int expon;
          printf("계수를 입력하시오.(실수) ");
          scanf("%f", &coef);
          printf("지수를 입력하시오.(정수) ");
          scanf("%d", &expon);
          insert_node_last(&list1, coef, expon);
}


printf("두번째 다항식의 입력할 항 수를 정하시오");
scanf("%d", &a);
for(i=0; i<a; i++)
{
          float coef;
          int expon;
          printf("계수를 입력하시오.(실수) ");
          scanf("%f", &coef);
          printf("지수를 입력하시오.(정수) ");
          scanf("%d", &expon);
          insert_node_last(&list2, coef, expon);
}


printf("1. 다항식 덧셈n");
printf("2. 다항식 뺄셈n");
printf("3. 다항식 곱셈n");
printf("4. 1번다항식 연산n");
printf("5. 2번다항식 연산n");
printf("6. 끝내기nn");
printf("원하는 항목을 선택하시오 : ");
scanf("%d", &choice);
if(choice==1)
{
     poly_add(&list1, &list2, &list3);
poly_print(&list3);
         }
         else if(choice==2)
         {
                poly_sub(&list1, &list2, &list3);
                poly_print(&list3);
         }
         else if(choice==3)
         {
                poly_mul(&list1, &list2, &list3);
                poly_print(&list3);
         }
         else if(choice==4)
                poly_op(&list1);
         else if(choice==5)
                poly_op(&list2);
         else if(choice==6)
                printf("감사합니다.");
         else
                printf("잘못입력하였습니다.");
         system("PAUSE");
}


void init(ListHeader *plist)
{
     plist->length = 0;
     plist->head = plist->tail = NULL;
}


void free_poly(struct ListHeader *list)
{
     free(list);
}


void insert_node_last(ListHeader *plist, float coef, int expon)
{
     ListNode *p = plist->head;
     ListNode *temp = (ListNode *)malloc(sizeof(ListNode));
     if( temp == NULL )
     {
             fprintf(stderr,"메모리 할당 에러n");
             exit(1);
     }
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++;
}


void poly_add(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 )
{
     ListNode *a = plist1->head;
     ListNode *b = plist2->head;
     float sum;
     while(a && b)
     {
                if( a->expon == b->expon )
                {
                       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 )
                {
                        insert_node_last(plist3, a->coef, a->expon);
                        a=a->link;
                }
                else
                {
                       insert_node_last(plist3, b->coef, b->expon);
                       b=b->link;
                }
     }
     for( ; a != NULL; a=a->link)
     insert_node_last(plist3, a->coef, a->expon);
     for( ; b != NULL; b=b->link)
     insert_node_last(plist3, b->coef, b->expon);
}


void poly_sub(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 )
{
     ListNode *a = plist1->head;
     ListNode *b = plist2->head;
     float sub;
     while(a && b)
     {
                if( a->expon == b->expon )
                {
                       sub = a->coef - b-> coef;
                       if( sub != 0 ) insert_node_last(plist3, sub, a->expon);
                       a=a->link; b=b->link;
                }
                else if( a->expon > b->expon )
                {
                        insert_node_last(plist3, a->coef, a->expon);
                        a=a->link;
                }
                else
                {
                       insert_node_last(plist3, b->coef, b->expon);
                       b=b->link;
                }
     }
     for( ; a != NULL; a=a->link)
     insert_node_last(plist3, a->coef, a->expon);
     for( ; b != NULL; b=b->link)
     insert_node_last(plist3, b->coef, b->expon);
}


void poly_mul(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 )
{
     ListNode *a = plist1->head;
     ListNode *b = plist2->head;
     ListNode *p = plist3->head;
     float mul_coef;
     int mul_expon;
     while(a)
     {
          while(b)
          {
mul_coef = a->coef * b->coef;
                         mul_expon = a->expon + b->expon;
                         insert_node_last(plist3, mul_coef, mul_expon);
                         b=b->link;
                   }
                   b=plist2->head;
                   a=a->link;
             }
        }


        void poly_op(ListHeader *plist)
        {
             ListNode *a = plist->head;
             float x,c,value=0;
             printf("x값을 입력하시오 : ");
             scanf("%f", &x);
             for(; a != NULL; )
             {
                    c=pow(x,a->expon);
                    c*=a->coef;
                    value+=c;
                    a=a->link;
             }
             printf("%f",value);
        }


        void poly_print(ListHeader *plist)
        {
             ListNode *p=plist->head;
             for(;p;p=p->link)
             {
                    printf("%.3fx^%d + ", p->coef, p->expon);
                       if (p->link == NULL){
                                   printf("%c%c",8,8);
                                   }
             }
             free_poly(plist);
        }
        1. 덧셈 연산
        입력 : P(X) = 3x^4 + 5x^6
결과 출력            S(X) = 3x^4 + 5x^6
        결과 : 6x^4 + 10x^6
2. 곱셈 연산 (문제점)
           입력 : P(X) = 3x^4 + 5x^6
                 S(X) = 3x^4 + 5x^6
           출력 : 9x^8 + 15x^10 + 15x^10 + 25x^12


           1. 덧셈 연산




           2. 곱셈 연산 (문제점)




                                      Ⅳ. 반성


           연결 리스트에 대해 많이 알게 되었지만, 과제를 확실하게 마무리 하지 못해 아쉬운 점이
과제를 마치면서
           많이 남는 프로젝트였습니다.
  느낀 점
           사전 자료조사에 대한 중요성을 다시 한번 알게 되었습니다.
자구3번

자구3번

  • 1.
    B2조 자료구조 과제 보고서 [ Project #3 : 다항식 계산 ] 조장 : 최완철 조원 : 고충욱 강승우 정준용 김남희
  • 2.
    과제수행일지 소속 조원 B2 조장 : 최완철 자료조사 : 강승우, 김남희 프로그래밍 : 고충욱, 정준용 과제수행기간 3일 I. 계획의 작성 연구제목 Linked List 학습한 내용에 대해 이해를 하고, Linked List의 정의를 알고, 연구배경 이것을 프로그램으로 만들어 봄으로써 활용법을 안다. http://ko.wikipedia.org/wiki/%EB%A7%81%ED%81%AC%EB%93%9C_ %EB%A6%AC%EC%8A%A4%ED%8A%B8 참고자료 참고 URL -> 링크드 리스트의 정의와 종류 http://blog.naver.com/skout123?Redirect=Log&logNo=50134180161 -> 연결리스트와 용어에 대한 설명, 사진 (본문에 포함) II. 계획의 실행 첫째 날 2012년 4월 12일 목요일 오늘의 작업 계획수립 및 역할 분담 조장 : 최완철 자료조사 : 강승우, 김남희 프로그래밍 : 고충욱, 정준용 토의 내용 위와 같이 조원의 업무 분담을 하였으며, 3번째 과제와 관련된 링크드 리스트에 대한 자 료조사를 최우선적으로 하기로 했다. 그리고 역할 분담은 각자가 하고 싶은 역할 위주로 정하였다. 과제준비에서 첫날에 아무것도 모르는 상황이라서 토의 진행이 되지 않았었다. 느낀 점 그 때문에 사전 자료조사의 중요성을 느끼게 되었다.
  • 3.
    둘째 날 2012년 4월 17일 화요일 오늘의 작업 링크드 리스트에 대한 자료를 이용하여 개념 이해 및 소스 구현방법 이해 링크드 리스트 과제를 수행하기 위해서는 개념 이해가 중요하다고 느꼈다. 그래서 자료조사팀에서 조사한 내용을 가지고 이해하였다. 토의 내용
  • 4.
    과제준비에서 링크드 리스트의 개념과 구조를 알게 되었으나, 소스로 구현하게 된다면 예상하지 못한 느낀 점 문제들이 발생할 것 같다고 느꼈다. 셋째 날 2012년 4월 19일 목요일 오늘의 작업 소스 초안 확인 및 개선방향 설정 소스초안에서는 다항식 연산에서 덧셈과 뺄셈만 구현하였다. 소스 초안의 연산 과정에 있어서 특별한 문제는 없었다. 토의 내용 아직 곱셈과 나눗셈 연산은 구현하지 못했기 때문에 이 부분에 대해서 초안에 추가적으로 구현을 하기로 하였다. 곱셈 및 나눗셈 연산에서 지수가 같은 경우를 걸러내는 방법을 구현하는데 난관을 겪었 과제준비에서 다. 느낀 점 곱셈과 나눗셈에 대한 더 많은 공부가 필요하다고 느끼게 되었다. 넷째 날 2012년 4월 24일 화요일 오늘의 작업 프로그램 소스 초안 코딩 #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;
  • 5.
    void init(ListHeader *plist) { plist->length = 0; plist->head = plist->tail = NULL; } void insert_node_last(ListHeader *plist, int coef, int expon) { ListNode *temp = (ListNode *)malloc(sizeof(ListNode)); if( temp == NULL ){ fprintf(stderr,"메모리 할당 에러n"); exit(1); } 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++; } void poly_add(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 ) { ListNode *a = plist1->head; ListNode *b = plist2->head; int sum; while(a && b){ if( a->expon == b->expon ){ 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 ){ insert_node_last(plist3, a->coef, a->expon); a=a->link; } else { insert_node_last(plist3, b->coef, b->expon); b=b->link; } } for( ; a != NULL; a=a->link) insert_node_last(plist3, a->coef, a->expon);
  • 6.
    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 %dn", p->coef, p->expon); } } main() { ListHeader list1, list2, list3; init(&list1); init(&list2); init(&list3); insert_node_last(&list1, 3,12); insert_node_last(&list1, 2,8); insert_node_last(&list1, 1,0); insert_node_last(&list2, 8,12); insert_node_last(&list2, -3,10); insert_node_last(&list2, 10,6); poly_add(&list1, &list2, &list3); poly_print(&list3); } 문제점 덧셈 연산만 가능함 해결 방안 덧셈 연산을 응용하여 뺄셈 연산을 구현하고 곱셈 및 나눗셈 연산도 구현해야 함 다섯째 날 2012년 4월 25일 수요일 오늘의 작업 2안 소스 확인 및 개선 방향 설정 #include <stdio.h> #include <stdlib.h> #include <math.h> 2안 typedef struct ListNode { float coef; int expon;
  • 7.
    struct ListNode *link; }ListNode; typedef struct ListHeader { int length; ListNode *head; ListNode *tail; } ListHeader; void init(ListHeader *plist); void free_poly(struct ListHeader *list); void insert_node_last(ListHeader *plist, float coef, int expon); void poly_add(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 ); void poly_sub(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 ); void poly_mul(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 ); void poly_op(ListHeader *plist); void poly_print(ListHeader *plist); main() { ListHeader list1, list2, list3; int choice, a, i; init(&list1); init(&list2); init(&list3); printf("첫번째 다항식의 입력할 항 수를 정하시오"); scanf("%d", &a); for(i=0; i<a; i++) { float coef; int expon; printf("계수를 입력하시오.(실수) "); scanf("%f", &coef); printf("지수를 입력하시오.(정수) "); scanf("%d", &expon); insert_node_last(&list1, coef, expon); } printf("두번째 다항식의 입력할 항 수를 정하시오"); scanf("%d", &a); for(i=0; i<a; i++) {
  • 8.
    float coef; int expon; printf("계수를 입력하시오.(실수) "); scanf("%f", &coef); printf("지수를 입력하시오.(정수) "); scanf("%d", &expon); insert_node_last(&list2, coef, expon); } printf("1. 다항식 덧셈n"); printf("2. 다항식 뺄셈n"); printf("3. 다항식 곱셈n"); printf("4. 1번다항식 연산n"); printf("5. 2번다항식 연산n"); printf("6. 끝내기nn"); printf("원하는 항목을 선택하시오 : "); scanf("%d", &choice); if(choice==1) { poly_add(&list1, &list2, &list3); poly_print(&list3); } else if(choice==2) { poly_sub(&list1, &list2, &list3); poly_print(&list3); } else if(choice==3) { poly_mul(&list1, &list2, &list3); poly_print(&list3); } else if(choice==4) poly_op(&list1); else if(choice==5) poly_op(&list2); else if(choice==6) printf("감사합니다."); else printf("잘못입력하였습니다."); system("PAUSE"); }
  • 9.
    void init(ListHeader *plist) { plist->length = 0; plist->head = plist->tail = NULL; } void free_poly(struct ListHeader *list) { free(list); } void insert_node_last(ListHeader *plist, float coef, int expon) { ListNode *p = plist->head; ListNode *temp = (ListNode *)malloc(sizeof(ListNode)); if( temp == NULL ) { fprintf(stderr,"메모리 할당 에러n"); exit(1); } 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++; } void poly_add(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 ) { ListNode *a = plist1->head; ListNode *b = plist2->head; float sum; while(a && b) { if( a->expon == b->expon )
  • 10.
    { 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 ) { insert_node_last(plist3, a->coef, a->expon); a=a->link; } else { insert_node_last(plist3, b->coef, b->expon); b=b->link; } } for( ; a != NULL; a=a->link) insert_node_last(plist3, a->coef, a->expon); for( ; b != NULL; b=b->link) insert_node_last(plist3, b->coef, b->expon); } void poly_sub(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 ) { ListNode *a = plist1->head; ListNode *b = plist2->head; float sub; while(a && b) { if( a->expon == b->expon ) { sub = a->coef - b-> coef; if( sub != 0 ) insert_node_last(plist3, sub, a->expon); a=a->link; b=b->link; } else if( a->expon > b->expon ) { insert_node_last(plist3, a->coef, a->expon); a=a->link; } else { insert_node_last(plist3, b->coef, b->expon);
  • 11.
    b=b->link; } } for( ; a != NULL; a=a->link) insert_node_last(plist3, a->coef, a->expon); for( ; b != NULL; b=b->link) insert_node_last(plist3, b->coef, b->expon); } void poly_mul(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 ) { ListNode *a = plist1->head; ListNode *b = plist2->head; ListNode *p = plist3->head; float mul_coef; int mul_expon; while(a) { while(b) { mul_coef = a->coef * b->coef; mul_expon = a->expon + b->expon; insert_node_last(plist3, mul_coef, mul_expon); b=b->link; } b=plist2->head; a=a->link; } } void poly_op(ListHeader *plist) { ListNode *a = plist->head; float x,c,value=0; printf("x값을 입력하시오 : "); scanf("%f", &x); for(; a != NULL; ) { c=pow(x,a->expon); c*=a->coef; value+=c; a=a->link; }
  • 12.
    printf("%f",value); } void poly_print(ListHeader *plist) { ListNode *p=plist->head; for(;p;p=p->link) { printf("%.3fx^%d ", p->coef, p->expon); } free_poly(plist); } 문제점 다항식 곱셈연산에서 지수가 같은 항의 계수부분이 연산 되지 않음 III. 결과 #include <stdio.h> #include <stdlib.h> #include <math.h> typedef struct ListNode { float coef; int expon; struct ListNode *link; } ListNode; typedef struct ListHeader { int length; ListNode *head; 최종 프로그램 ListNode *tail; 소스 } ListHeader; void init(ListHeader *plist); void free_poly(struct ListHeader *list); void insert_node_last(ListHeader *plist, float coef, int expon); void poly_add(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 ); void poly_sub(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 ); void poly_mul(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 ); void poly_op(ListHeader *plist); void poly_print(ListHeader *plist); main() {
  • 13.
    ListHeader list1, list2,list3; int choice, a, i; init(&list1); init(&list2); init(&list3); printf("첫번째 다항식의 입력할 항 수를 정하시오"); scanf("%d", &a); for(i=0; i<a; i++) { float coef; int expon; printf("계수를 입력하시오.(실수) "); scanf("%f", &coef); printf("지수를 입력하시오.(정수) "); scanf("%d", &expon); insert_node_last(&list1, coef, expon); } printf("두번째 다항식의 입력할 항 수를 정하시오"); scanf("%d", &a); for(i=0; i<a; i++) { float coef; int expon; printf("계수를 입력하시오.(실수) "); scanf("%f", &coef); printf("지수를 입력하시오.(정수) "); scanf("%d", &expon); insert_node_last(&list2, coef, expon); } printf("1. 다항식 덧셈n"); printf("2. 다항식 뺄셈n"); printf("3. 다항식 곱셈n"); printf("4. 1번다항식 연산n"); printf("5. 2번다항식 연산n"); printf("6. 끝내기nn"); printf("원하는 항목을 선택하시오 : "); scanf("%d", &choice); if(choice==1) { poly_add(&list1, &list2, &list3);
  • 14.
    poly_print(&list3); } else if(choice==2) { poly_sub(&list1, &list2, &list3); poly_print(&list3); } else if(choice==3) { poly_mul(&list1, &list2, &list3); poly_print(&list3); } else if(choice==4) poly_op(&list1); else if(choice==5) poly_op(&list2); else if(choice==6) printf("감사합니다."); else printf("잘못입력하였습니다."); system("PAUSE"); } void init(ListHeader *plist) { plist->length = 0; plist->head = plist->tail = NULL; } void free_poly(struct ListHeader *list) { free(list); } void insert_node_last(ListHeader *plist, float coef, int expon) { ListNode *p = plist->head; ListNode *temp = (ListNode *)malloc(sizeof(ListNode)); if( temp == NULL ) { fprintf(stderr,"메모리 할당 에러n"); exit(1); }
  • 15.
    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++; } void poly_add(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 ) { ListNode *a = plist1->head; ListNode *b = plist2->head; float sum; while(a && b) { if( a->expon == b->expon ) { 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 ) { insert_node_last(plist3, a->coef, a->expon); a=a->link; } else { insert_node_last(plist3, b->coef, b->expon); b=b->link; } } for( ; a != NULL; a=a->link) insert_node_last(plist3, a->coef, a->expon); for( ; b != NULL; b=b->link) insert_node_last(plist3, b->coef, b->expon);
  • 16.
    } void poly_sub(ListHeader *plist1,ListHeader *plist2, ListHeader *plist3 ) { ListNode *a = plist1->head; ListNode *b = plist2->head; float sub; while(a && b) { if( a->expon == b->expon ) { sub = a->coef - b-> coef; if( sub != 0 ) insert_node_last(plist3, sub, a->expon); a=a->link; b=b->link; } else if( a->expon > b->expon ) { insert_node_last(plist3, a->coef, a->expon); a=a->link; } else { insert_node_last(plist3, b->coef, b->expon); b=b->link; } } for( ; a != NULL; a=a->link) insert_node_last(plist3, a->coef, a->expon); for( ; b != NULL; b=b->link) insert_node_last(plist3, b->coef, b->expon); } void poly_mul(ListHeader *plist1, ListHeader *plist2, ListHeader *plist3 ) { ListNode *a = plist1->head; ListNode *b = plist2->head; ListNode *p = plist3->head; float mul_coef; int mul_expon; while(a) { while(b) {
  • 17.
    mul_coef = a->coef* b->coef; mul_expon = a->expon + b->expon; insert_node_last(plist3, mul_coef, mul_expon); b=b->link; } b=plist2->head; a=a->link; } } void poly_op(ListHeader *plist) { ListNode *a = plist->head; float x,c,value=0; printf("x값을 입력하시오 : "); scanf("%f", &x); for(; a != NULL; ) { c=pow(x,a->expon); c*=a->coef; value+=c; a=a->link; } printf("%f",value); } void poly_print(ListHeader *plist) { ListNode *p=plist->head; for(;p;p=p->link) { printf("%.3fx^%d + ", p->coef, p->expon); if (p->link == NULL){ printf("%c%c",8,8); } } free_poly(plist); } 1. 덧셈 연산 입력 : P(X) = 3x^4 + 5x^6 결과 출력 S(X) = 3x^4 + 5x^6 결과 : 6x^4 + 10x^6
  • 18.
    2. 곱셈 연산(문제점) 입력 : P(X) = 3x^4 + 5x^6 S(X) = 3x^4 + 5x^6 출력 : 9x^8 + 15x^10 + 15x^10 + 25x^12 1. 덧셈 연산 2. 곱셈 연산 (문제점) Ⅳ. 반성 연결 리스트에 대해 많이 알게 되었지만, 과제를 확실하게 마무리 하지 못해 아쉬운 점이 과제를 마치면서 많이 남는 프로젝트였습니다. 느낀 점 사전 자료조사에 대한 중요성을 다시 한번 알게 되었습니다.