SlideShare une entreprise Scribd logo
1  sur  18
Télécharger pour lire hors ligne
C2조 과제물 발표
과제수행일지
                                                            조원소개
                  C2 조
                                           조장                       박태원
소 속                                       자료조사                    김창헌, 김정무
                                          프로그래밍                   김현호, 박가혜
과제수행기간                                            14   일                       16     시간
                                      주     제

연구제목     다항식의 연산



         연결 리스트를 이용해 다항식을 입력받고, 이를 구현해 다항식의 연산을 실행함으로서 연결
연구배경     리스트의 개념과 그 장단점에 대해 이해하고 그것을 필요로 하는 부분에 시기적절하게 이용
         할 수 있다.

                                    참 고 자 료

         C로 쓴 자료구조론(저자 : 이석호, 교보문고 2nd)
         C언어로 구현한 자료구조(저자 : 임형근, 정일출판사)
참고 서적




         http://blog.naver.com/skout123?Redirect=Log&logNo=50134180161 : 단순 연결리스트 내용 참조
         http://blog.naver.com/skout123?Redirect=Log&logNo=50134180161 : 이중 연결리스트 내용 참조
         http://blog.naver.com/skout123?Redirect=Log&logNo=50134180161 : 원형 연결리스트 내용 참조
참고 URL

         http://croute.me/27 : 연결리스트를 이용한 다항식의 연산 소스 참조

                                    과제의 수행
 첫째날                      2012    년        4 월       12              일              목요일
회의 주제                            조원 자기소개 및 역할분담, 계획 작성

         조장 : 박태원
         자료조사 : 김창헌, 김정무
         프로그래밍 : 김현호, 박가혜

         미리 조사해온 연결리스트에 대한 개념을 정리하고 일정표를 작성하는 방향으로 진행되었
         습니다. 첫 시간이기 때문에 조원들 각자가 연결리스트에 대한 개념을 알고, 과제 수행에
         필요한 부분을 짚어 능동적으로 역할을 수행할 수 있게 하기 위해 함께 기본적인 내용에
         대해 정리했습니다.
회의 내용

         1. 연결 리스트
         - 관계된 자료들의 순차적인 조직 상태를 연결필드를 사용해 나타내는 것으로 다음에 위
          치할 자료가 기억장소 어디에 있는지 알려주는 연결필드를 보고 자료들의 관계를 추측
          해낼 수 있다.

         2. 연결 리스트의 구성요소
         1) 노드 : 자료필드와 다음 자료가 있는 위치를 알려주는 연결 필드로 구성되어 있는 레
                 코드 형식의 구성체를 이야기하며 그 형태는 아래와 같다.




                                       - 1 -
2) 헤드 : 연결리스트의 처음을 가리키는 포인터 변수
       3) 테일 : 연결리스트의 마지막 부분을 가리키며 연결필드 부분을 NULL 로 기술해 처리한다.

       3. 단순 연결리스트의 구성방식
       - 연결필드를 통해 이어져 있는 모습이 배열과 흡사하다.




       4. 연결리스트를 통한 다항식의 구현
        - 연결리스트를 이용해 다항식을 구현한다면 연결리스트를 구성하는 노드의 형태는 아래와 같다.


          계수 필드 지수 필드 연결 필드

       이상의 내용을 바탕으로 일정표를 작성하였으며 작성된 일정표의 내용에 따라 다음 주 화
       요일 자료구조 시간까지 프로그래밍 팀은 C언어를 통해 직접 노드를 구현해보며 프로그램
       초안의 틀을 만들고 조장과 자료조사팀은 연결리스트의 장단점과 이를 보완하기 위해 나타
       난 연결리스트의 다른 형태에 대해 조사하고 다항식의 연산과 관련된 프로그램 소스에 대
       해 조사해 오기로 하였습니다.

       구조체나 포인터를 이용하는데 익숙하지 않아 해당 내용을 이해하는데 오랜 시간이 걸렸던
       것 같습니다. 이를 해결하기 위해 자료조사 팀이 연결리스트에 대한 추가적인 내용을 조사
       하는 동안 프로그래밍 팀이 직접 C언어로 연결리스트를 구현해 보면서 해당 내용에 대해
 반성

       공부하기로 했습니다.

둘째날               2012   년       4 월       17   일       화요일
회의주제                     이중 연결리스트와 원형 연결리스트

회의내용   순차리스트(배열)과 대비된 연결리스트의 장단점과, 단순 연결리스트의 단점을 보완하기 위
       해 만들어진 이중 연결리스트와 원형 연결리스트에 대한 내용을 프로그래밍 팀에게 알려주




                            - 2 -
는 방향으로 진행되었습니다.



1. 연결리스트의 장점
 1) 동적인 기억장소 관리
  - 그때그때 필요한 기억장소만큼을 배정받아 사용
                           사용하기 때문에 미리 여유로운 공간을
    배정해 줘야 하는 배열에 비해 공간을 사용하는 효율이 높다.
 2) 자료의 재배열이 빠르다
  - 배열과 달리 리스트의 길이에 관계없이 연결필드 부분의 필드값을 변화시키는 것만
    으로도 자료를 재배열 할 수 있다.
 3) 리스트의 삭제조작이 빠르다
  - 배열과 달리 많은 자료의 이동이 일어나지 않으며, 삭제조작이 일어나는 노드의 직
    전 노드가 가진 연결 필드값을 바꿔주는 것만으로도 삭제 연산이 완료된다.
 4) 리스트간의 결합이 쉽다
  - 결합하고자 하는 리스트 간의 꼬리부분과 머리부분을 이어주는 것만으로 리스트의
    결합이 완료된다.


2. 연결리스트의 단점
 1) 노드의 검색이 느리다(접근성이 낮다)
   - 정해진 주소값을 입력해주면 곧바로 접근이 가능한 배열과 달리 헤드 부분부터 순
                     방식이기 때문에 배열에 비해 오랜 시간이 걸린다.
     차적으로 검색해가며 접근하는 방식
 2) 자료를 잃어버릴 가능성이 높다
   - 연결리스트의 자료 구조가 복잡하기 때문에 연결 필드값을 조작하는데 실수가 발생
    하면 대량의 자료를 잃어버릴 가능성
                    가능성이 있다.


3. 이중 연결리스트
 - 위에서 언급된 연결리스트의 약점을 보완하기 위한 해결책으로 하나의 노드가 두 개
   의 연결 필드 가져 양방향의 이동이 가능해졌다. 인접한 노드의 접근성이 높아
        필드를                                높아짐으
   로서 특정 노드의 검색, 삭제에 있어 단순 연결리스트에 비해 효율적인 일처리가 가
   능하다.
 - 이중 연결리스트의 형태는 아래와 같다.




4. 원형 연결리스트




                   - 3 -
- 노드의 꼬리가 리스트의 헤드 부분을 가리키는 형태 계속해서 순환하는 원의 형태
                                          형태로
                를 가지게 되었다. 항상 처음부터 검색을 실행하는 단순 연결리스트와 달리 포인터가
                 가리키는 부분부터 검색을 실행 수 있어 효율이 높으며 그 효율을 극대화하기 위
                               실행할
                 해 보통 이중 연결리스트와 함께 사용
                                   사용한다.
              - 원형 연결리스트의 형태는 아래와 같다.




          프로그램 초안이 만들어지지 않아 프로그램에 대해 회의를 진행 할 수가 없었습니다. 연결
          리스트의 장단점과 단점을 해결하기 위한 방안에 대한 학습 위주로 회의가 진행되었으며
          목요일까지 덧셈식과 뺄셈식에 가능하다면 곱셈식까지 만들어진 소스를 만들어 회의를 진
  반성

          행하기로 하였습니다.

 셋째날                              2012     년       4 월         19                   일   목요일
 회의주제                                       프로그램 초안 확인, 개량안 제시
          #include<stdio.h>
          #include <stdlib.h>
          #include <conio.h>




          typedef struct Node *polyPointer;
          polyPointer addPoly(polyPointer poly, int c, int e, polyPointer *tail);
          polyPointer addNode(polyPointer Link, int c, int e);
          polyPointer Input();
          void printPoly(polyPointer p);
          polyPointer Add(polyPointer A, polyPointer B);
          polyPointer Mult(polyPointer A, polyPointer B);
          polyPointer Sub(polyPointer A,polyPointer B);
프로그램 초안
          void xprint(int bb,polyPointer p);

          struct Node {
                    int coef;
                    int expon;
                    polyPointer link;
          };

          int main(void)
          {
                    polyPointer P, S, T;
                    int aa;




                                                   - 4 -
int bb;
          printf("첫번째 다항식 입력n");
          P = Input();
          printf("두번째 다항식 입력n");
          S = Input();
          printf("P = ");
          printPoly(P);
          printf("S = ");
          printPoly(S);

          T = Add(P, S);
          printf("n다항식 덧셈 결과 : =");
          printPoly(T);

          T= Sub(P,S);
          printf("n다항식 뺄셈 결과 : =");
          printPoly(T);

          getch();
}



polyPointer Input()
{
          polyPointer p = NULL;
          int coef, expon;
          while (coef != -1 && expon != -1) {
                     printf(" 계수와 지수 입력 (종료시는 -1 -1 입력) : ");
                     scanf("%d %d", &coef, &expon);
                     if (expon != -1) p = addNode(p, coef, expon);
          }
          return p;
}




polyPointer addPoly(polyPointer poly, int c, int e, polyPointer *tail)
{
          polyPointer Mono;
          Mono = (polyPointer)malloc(sizeof(struct Node));
          Mono->expon = e;
          Mono->coef = c;
          if ( poly == NULL ) {
                     poly = Mono;
                     *tail = Mono;
          }
          else {
                     (*tail)->link = Mono;
                     *tail = Mono;
          }
          (*tail)->link = NULL;
          return poly;
}



polyPointer addNode(polyPointer Link, int c, int e)
{
          polyPointer Mono, p;
          Mono = (polyPointer)malloc(sizeof(struct Node));
          Mono->coef = c;
          Mono->expon = e;




                                         - 5 -
Mono->link = NULL;
         if (Link == NULL) {
                   Link = Mono;
                   return Link;
         }
         p = Link;
         while (p->link != NULL)
         p = p->link;
         p->link = Mono;
         return Link;
}

polyPointer Add(polyPointer a, polyPointer b)
{
          int sum;
          polyPointer r;
          polyPointer result;
          r = NULL;
          result = NULL;
          while ( a != NULL && b != NULL ) {
                    if ( a->expon == b->expon ) {
                               sum = a->coef + b->coef;
                               if ( sum != 0 ) {
                                         result = addPoly(result, sum, a->expon, &r);
                               }
                               a = a->link;
                               b = b->link;
                    }
                    else if ( a->expon < b->expon ) {
                               result = addPoly(result, b->coef, b->expon, &r);
                               b = b->link;
                    }
                    else if ( a->expon > b->expon ) {
                               result = addPoly(result, a->coef, a->expon, &r);
                               a = a->link;
                    }
          }
          while ( a != NULL ) {
                    result = addPoly(result, a->coef, a->expon, &r);
                    a = a->link;
          }
          while ( b != NULL ) {
                    result = addPoly(result, b->coef, b->expon, &r);
                    b = b->link;
          }
          r->link = NULL;
          return result;
}

polyPointer Sub(polyPointer a, polyPointer b)
{
          int sum;
          polyPointer r;
          polyPointer result;
          r = NULL;
          result = NULL;
          while ( a != NULL && b != NULL ) {
                    if ( a->expon == b->expon ) {
                               sum = a->coef - b->coef;
                               if ( sum != 0 ) {
                                         result = addPoly(result, sum, a->expon, &r);




                                      - 6 -
}
                                    a = a->link;
                                    b = b->link;
                          }
                          else if ( a->expon < b->expon ) {
                                     result = addPoly(result, -(b->coef), b->expon, &r);
                                     b = b->link;
                          }
                          else if ( a->expon > b->expon ) {
                                     result = addPoly(result, a->coef, a->expon, &r);
                                     a = a->link;
                          }
                }
                while ( a != NULL ) {
                          result = addPoly(result, a->coef, a->expon, &r);
                          a = a->link;
                }
                while ( b != NULL ) {
                          result = addPoly(result, -(b->coef), b->expon, &r);
                          b = b->link;
                }
                r->link = NULL;
                return result;
       }



       void printPoly(polyPointer p)
       {
                  while (p != NULL) {
                              printf("%dx^%d", p->coef, p->expon);
                              p = p->link;
                              if (p != NULL && p->coef > 0) printf("+");
                  }
                  printf("n");
       }



       덧셈과 뺄셈식까지는 구현을 마쳤으며 곱셈과 나눗셈식을 구현하는 방법에 대해 논의했습니다.
회의내용
       while문을 이중으로 사용해 각 노드의 데이터값을 계산해 나가기로 하였으며 곱셈식에 대한 알고
       리즘은 아래와 같습니다.




                                             - 7 -
만들어진 각각의 연결리스트에 포인터를 부여한다



           다항식 P(x)를 가리키는 포인터의 값이 NULL을 가리킬 때까지 실행되는 while문을
           구성하고 그 안에 S(x)를 가리키는 포인터의 값이 NULL을 가리킬 때까지 실행되는
                          while문을 하나 더 만들어 이중 while문의 형태를 잡는다.



            S(x)의 데이터값을 가리키는 포인터가 이동하는 동안 P(x)의 포인터가 가리키는
            데이터값과 S(x)의 데이터값을 이용해 각각의 항의 곱을 구해 T(x)에 저장한다.
            S(x)의 포인터가 NULL을 가리키게 되면 S(x)의 포인터값을 초기화하고 P(x)의
                                                     반복한다.
                               포인터를 한칸 이동시킨 뒤 위의 과정을 반복한다.



               P(x)의 포인터가 NULL을 가리키면 T(x)를 반환하고 알고리즘을 종료한다.

       조장과 프로그래밍팀은 해당 알고리즘을 c언어로 구현해보고, 자료조사팀은 계속해서 나눗셈 연산
       식에 관련된 자료와 알고리즘을 찾아보기로 했습니다.

       P(x)에 관한 연산이 불가능하며, 다항식의 곱셈과 나눗셈 기능이 없습니다.
       => 곱셈 연산 알고리즘을 통한 곱셈 기능 추가
       빼기 연산 과정 중에 논리오류 발생(계수가 부호가 들어가야 하는 부분에 +기호가 들어감)
문제점

       => 논리 오류 제거



       곱셈 연산에 대한 알고리즘의 틀을 잡고 나눗셈 연산의 알고리즘에 대해 논의했으나 좋은
 반성    결과를 얻지 못했습니다. 우선 초안을 토대로 곱셈식과 뺄셈식을 응용한 알고리즘을 구상
       해 보기로 하고 회의를 마쳤습니다.

넷째날                            2012     년              4 월                       24   일   화요일
회의주제                                                 프로그램 보완
       #include<stdio.h>
       #include <stdlib.h>
       #include <conio.h>




       typedef struct Node *polyPointer;
       polyPointer addPoly(polyPointer poly, int c, int e, polyPointer *tail);
       polyPointer addNode(polyPointer Link, int c, int e);
프로그램   polyPointer Input();
       void printPoly(polyPointer p);
수정안    polyPointer Add(polyPointer A, polyPointer B);
       polyPointer Mult(polyPointer A, polyPointer B);
       polyPointer Sub(polyPointer A,polyPointer B);
       void xprint(int bb,polyPointer p);

       struct Node {
                 int coef;
                 int expon;
                 polyPointer link;
       };




                                                - 8 -
int main(void)
{
          polyPointer P, S, T;
          int aa;
          int bb;
          printf("첫번째 다항식 입력n");
          P = Input();
          printf("두번째 다항식 입력n");
          S = Input();
          printf("P = ");
          printPoly(P);
          printf("S = ");
          printPoly(S);

          T = Add(P, S);
          printf("n다항식 덧셈 결과 : =");
          printPoly(T);

          T = Mult(P, S);
          printf("n다항식 곱셈 결과 : =");
          printPoly(T);

          T= Sub(P,S);
          printf("n다항식 뺄셈 결과 : =");
          printPoly(T);

          getch();
}



polyPointer Input()
{
          polyPointer p = NULL;
          int coef, expon;
          while (coef != -1 && expon != -1) {
                     printf(" 계수와 지수 입력 (종료시는 -1 -1 입력) : ");
                     scanf("%d %d", &coef, &expon);
                     if (expon != -1) p = addNode(p, coef, expon);
          }
          return p;
}




polyPointer addPoly(polyPointer poly, int c, int e, polyPointer *tail)
{
          polyPointer Mono;
          Mono = (polyPointer)malloc(sizeof(struct Node));
          Mono->expon = e;
          Mono->coef = c;
          if ( poly == NULL ) {
                     poly = Mono;
                     *tail = Mono;
          }
          else {
                     (*tail)->link = Mono;
                     *tail = Mono;
          }
          (*tail)->link = NULL;
          return poly;




                                         - 9 -
}



polyPointer addNode(polyPointer Link, int c, int e)
{
          polyPointer Mono, p;
          Mono = (polyPointer)malloc(sizeof(struct Node));
          Mono->coef = c;
          Mono->expon = e;
          Mono->link = NULL;
          if (Link == NULL) {
                    Link = Mono;
                    return Link;
          }
          p = Link;
          while (p->link != NULL)
          p = p->link;
          p->link = Mono;
          return Link;
}

polyPointer Add(polyPointer a, polyPointer b)
{
          int sum;
          polyPointer r;
          polyPointer result;
          r = NULL;
          result = NULL;
          while ( a != NULL && b != NULL ) {
                    if ( a->expon == b->expon ) {
                               sum = a->coef + b->coef;
                               if ( sum != 0 ) {
                                         result = addPoly(result, sum, a->expon, &r);
                               }
                               a = a->link;
                               b = b->link;
                    }
                    else if ( a->expon < b->expon ) {
                               result = addPoly(result, b->coef, b->expon, &r);
                               b = b->link;
                    }
                    else if ( a->expon > b->expon ) {
                               result = addPoly(result, a->coef, a->expon, &r);
                               a = a->link;
                    }
          }
          while ( a != NULL ) {
                    result = addPoly(result, a->coef, a->expon, &r);
                    a = a->link;
          }
          while ( b != NULL ) {
                    result = addPoly(result, b->coef, b->expon, &r);
                    b = b->link;
          }
          r->link = NULL;
          return result;
}

polyPointer Sub(polyPointer a, polyPointer b)
{
          int sum;




                                      - 10 -
polyPointer r;
          polyPointer result;
          r = NULL;
          result = NULL;
          while ( a != NULL && b != NULL ) {
                    if ( a->expon == b->expon ) {
                               sum = a->coef - b->coef;
                               if ( sum != 0 ) {
                                         result = addPoly(result, sum, a->expon, &r);
                               }
                               a = a->link;
                               b = b->link;
                    }
                    else if ( a->expon < b->expon ) {
                               result = addPoly(result, -(b->coef), b->expon, &r);
                               b = b->link;
                    }
                    else if ( a->expon > b->expon ) {
                               result = addPoly(result, a->coef, a->expon, &r);
                               a = a->link;
                    }
          }
          while ( a != NULL ) {
                    result = addPoly(result, a->coef, a->expon, &r);
                    a = a->link;
          }
          while ( b != NULL ) {
                    result = addPoly(result, -(b->coef), b->expon, &r);
                    b = b->link;
          }
          r->link = NULL;
          return result;
}



polyPointer Mult(polyPointer a, polyPointer b)
{

          polyPointer r;
          polyPointer C;
          polyPointer result;
          C = NULL;
          while ( b != NULL ) {
                    r = NULL;
                    result = NULL;
                    while ( a != NULL ) {
                              result = addPoly(result, a->coef*b->coef, a->expon+b->expon, &r);
                              a = a->link;
                    }
                    C = Add(C, result);
                    b = b->link;
          }
          return C;
}



void printPoly(polyPointer p)
{
           while (p != NULL) {
                     printf("%dx^%d", p->coef, p->expon);
                     p = p->link;




                                       - 11 -
if (p != NULL && p->coef > 0) printf("+");
                    }
                    printf("n");
          }



          polyPointer Mult(polyPointer A, polyPointer B)를 통해 다항식의 곱셈연산이 가능하도
          록 기능을 추가했습니다. 나눗셈 연산 알고리즘에 대한 의견이 제시되었지만 실제 다항식
          의 나눗셈 연산과는 관계없는 알고리즘이 되어 기각되었으며 다항식의 x에 임의의 값을 대
          입해 연산할 수 있는 알고리즘을 우선적으로 추가할 수 있도록 하자고 결론지었습니다. 다
          항식의 연산 알고리즘은 아래와 같습니다.

                                                      부여한다.
                                다항식을 의미하는 연결리스트에 포인터를 부여한다.
 회의내용

              다항식 P(x)의 x값을 입력받으면, x의 값을 포인터가 가리키는 노드의 지수값 만큼
                                                     더해준다.
                    반복하여 곱해주고 계수값을 곱해준 후 미리 정해준 변수값에 더해준다.



               P(x)의 포인터가 NULL값을 가리키면 변수값을 반환하고 알고리즘을 종료한다.




          나눗셈 연산 기능 X
          다항식의 x에 임의의 값을 대입해 연산하는 기능 X (해결)
 문제점




          다항식에 임의의 값을 대입해 연산하는 알고리즘을 작성하였으며 스위치나 if문을 이용해
          필요한 연산을 골라서 실행할 수 있도록 프로그램을 보완하기로 했습니다. 나눗셈 연산에
          대해서는 남은 시간동안 조원들 각자가 알고리즘이 떠오르는 대로 조원들에게 알리고 해당
  반성
          알고리즘을 구현해 실험해 보기로 하였습니다.


                                              결과 발표
          #include<stdio.h>
          #include <stdlib.h>
          #include <conio.h>


          typedef struct Node *polyPointer;
          polyPointer addPoly(polyPointer poly, int c, int e, polyPointer *tail);
          polyPointer addNode(polyPointer Link, int c, int e);
          polyPointer Input();
          void printPoly(polyPointer p);
          polyPointer Add(polyPointer A, polyPointer B);
프로그램 소스   polyPointer Mult(polyPointer A, polyPointer B);
          polyPointer Sub(polyPointer A,polyPointer B);
          void xprint(int bb,polyPointer p);

          struct Node {
                    int coef;
                    int expon;
                    polyPointer link;
          };

          int main(void)
          {




                                                  - 12 -
polyPointer P, S, T;
          int aa;
          int bb;
          printf("첫번째 다항식 입력n");
          P = Input();
          printf("두번째 다항식 입력n");
          S = Input();
          printf("P = ");
          printPoly(P);
          printf("S = ");
          printPoly(S);

    printf("원하는 연산을 입력하시오 1.덧셈, 2.곱셈, 3.뺄셈 : n");
           scanf("%d",&aa);
           getch();
           printf("다항식 P(x)를 계산하는데 사용할 x의 값을 입력하시오 : ");
           scanf("%d",&bb);
           xprint(bb,P);
           if(aa==1)
           {T = Add(P, S);
           printf("n다항식 덧셈 결과 : =");
           printPoly(T);}
           if(aa==2)
           {T = Mult(P, S);
           printf("n다항식 곱셈 결과 : =");
           printPoly(T); }
           if(aa==3)
           {T= Sub(P,S);
           printf("n다항식 뺄셈 결과 : =");
           printPoly(T);}

          printf("다항식 T(x)를 계산하는데 사용할 x의 값을 입력하시오 : ");
          scanf("%d",&bb);
          xprint(bb,T);

          getch();
}


polyPointer Input()
{
          polyPointer p = NULL;
          int coef, expon;
          while (coef != -1 && expon != -1) {
                     printf(" 계수와 지수 입력 (종료시는 -1 -1 입력) : ");
                     scanf("%d %d", &coef, &expon);
                     if (expon != -1) p = addNode(p, coef, expon);
          }
          return p;
}




polyPointer addPoly(polyPointer poly, int c, int e, polyPointer *tail)
{
          polyPointer Mono;
          Mono = (polyPointer)malloc(sizeof(struct Node));
          Mono->expon = e;
          Mono->coef = c;
          if ( poly == NULL ) {
                    poly = Mono;
                    *tail = Mono;
          }
          else {
                    (*tail)->link = Mono;
                    *tail = Mono;




                                        - 13 -
}
          (*tail)->link = NULL;
          return poly;
}


polyPointer addNode(polyPointer Link, int c, int e)
{
          polyPointer Mono, p;
          Mono = (polyPointer)malloc(sizeof(struct Node));
          Mono->coef = c;
          Mono->expon = e;
          Mono->link = NULL;
          if (Link == NULL) {
                    Link = Mono;
                    return Link;
          }
          p = Link;
          while (p->link != NULL)
          p = p->link;
          p->link = Mono;
          return Link;
}

polyPointer Add(polyPointer a, polyPointer b)
{
          int sum;
          polyPointer r;
          polyPointer result;
          r = NULL;
          result = NULL;
          while ( a != NULL && b != NULL ) {
                    if ( a->expon == b->expon ) {
                               sum = a->coef + b->coef;
                               if ( sum != 0 ) {
                                         result = addPoly(result, sum, a->expon, &r);
                               }
                               a = a->link;
                               b = b->link;
                    }
                    else if ( a->expon < b->expon ) {
                               result = addPoly(result, b->coef, b->expon, &r);
                               b = b->link;
                    }
                    else if ( a->expon > b->expon ) {
                               result = addPoly(result, a->coef, a->expon, &r);
                               a = a->link;
                    }
          }
          while ( a != NULL ) {
                    result = addPoly(result, a->coef, a->expon, &r);
                    a = a->link;
          }
          while ( b != NULL ) {
                    result = addPoly(result, b->coef, b->expon, &r);
                    b = b->link;
          }
          r->link = NULL;
          return result;
}

polyPointer Sub(polyPointer a, polyPointer b)
{
          int sub;
          polyPointer r;
          polyPointer result;




                                      - 14 -
r = NULL;
          result = NULL;
          while ( a != NULL && b != NULL ) {
                    if ( a->expon == b->expon ) {
                               sub = a->coef - b->coef;
                               if ( sub != 0 ) {
                                         result = addPoly(result, sub, a->expon, &r);
                               }
                               a = a->link;
                               b = b->link;
                    }
                    else if ( a->expon < b->expon ) {
                               result = addPoly(result, b->coef, b->expon, &r);
                               b = b->link;
                    }
                    else if ( a->expon > b->expon ) {
                               result = addPoly(result, a->coef, a->expon, &r);
                               a = a->link;
                    }
          }
          while ( a != NULL ) {
                    result = addPoly(result, a->coef, a->expon, &r);
                    a = a->link;
          }
          while ( b != NULL ) {
                    result = addPoly(result, -(b->coef), b->expon, &r);
                    b = b->link;
          }
          r->link = NULL;
          return result;
}




polyPointer Mult(polyPointer a, polyPointer b)
{

          polyPointer r;
          polyPointer C;
          polyPointer result;
          C = NULL;
          while ( b != NULL ) {
                    r = NULL;
                    result = NULL;
                    while ( a != NULL ) {
                              result = addPoly(result, (a->coef*b->coef), (a->expon+b->expon), &r);
                              a = a->link;
                    }
                    C = Add(C, result);
                    b = b->link;
          }
          return C;
}


void xprint(int bb,polyPointer p)
{

          int bbb=1;
          int sum=0;
          int i;
          int yy,jj;
          while (p!=NULL ) {
                     yy=p->coef;
                     jj=p->expon;




                                       - 15 -
for(i=0;i<jj;i++)
                             {
                             bbb*=bb;

                             }
                             sum+=bbb*yy;
                             p = p->link;
                             bbb=1;
                   }
                   printf("n");
                   printf("다항식의 값은 : %d ",sum);
          }
          void printPoly(polyPointer p)
          {
                     while (p != NULL) {
                                 printf("%dx^%d", p->coef, p->expon);
                                 p = p->link;
                                 if (p != NULL && p->coef > 0) printf("+");
                     }
                     printf("n");
          }

          1. 다항식의 덧셈과 뺄셈
                만들어진 각각의 연결리스트에 포인터를 부여하고, 각각의 포인터가 가리키는
                                            노드의 expon값을 비교한다.


                                                 양쪽 항의 지수값이 같을
               P(x)의 지수값이 클 때,                                                S(x)의 지수값이 클 때,
                                             때는 각 항의 계수를 더한
              포인터가 가리키는 P(x)                                                  포인터가 가리키는 P(x)
                                                 값과 지수값을 T(x)에
              노드가 가진 값을 T(x)에                                                 노드가 가진 값을 S(x)에
                                                 저장한다. 이후 각각의
               저장하고 포인터를 한칸                                                   저장하고 포인터를 한칸
                                                 항을 가리키는 포인터를
                 이동시킨 후 이전의                                                    이동시킨 후 이전의
                                                 한칸씩 이동하고 이전의
                   동작을 실행한다.
                       실행한다.                                                    동작을 실행한다.
                                                                                    실행한다.
                                                       실행한다.
                                                   동작을 실행한다.


                 둘 중 한쪽 연결리스트의 포인터가 가리키는 값이 NULL이 되면 다른 한쪽
                     연결리스트의 남은 노드값을 T(x)에 저장하고 알고리즘을 종료한다.

알고리즘 개요   2. 다항식의 곱셈
                                만들어진 각각의 연결리스트에 포인터를 부여한다



             다항식 P(x)를 가리키는 포인터의 값이 NULL을 가리킬 때까지 실행되는 while문을
             구성하고 그 안에 S(x)를 가리키는 포인터의 값이 NULL을 가리킬 때까지 실행되는
                           while문을 하나 더 만들어 이중 while문의 형태를 잡는다.



              S(x)의 데이터값을 가리키는 포인터가 이동하는 동안 P(x)의 포인터가 가리키는
              데이터값과 S(x)의 데이터값을 이용해 각각의 항의 곱을 구해 T(x)에 저장한다.
              S(x)의 포인터가 NULL을 가리키게 되면 S(x)의 포인터값을 초기화하고 P(x)의
                                                      반복한다.
                                포인터를 한칸 이동시킨 뒤 위의 과정을 반복한다.



                 P(x)의 포인터가 NULL을 가리키면 T(x)를 반환하고 알고리즘을 종료한다.




                                                 - 16 -
3. 다항식의 연산
                                           부여한다.
                     다항식을 의미하는 연결리스트에 포인터를 부여한다.



          다항식 P(x)의 x값을 입력받으면, x의 값을 포인터가 가리키는 노드의 지수값 만큼
                                              더해준다.
             반복하여 곱해주고 계수값을 곱해준 후 미리 정해준 변수값에 더해준다.



          P(x)의 포인터가 NULL값을 가리키면 변수값을 반환하고 알고리즘을 종료한다.




구동 화면




문제점     나눗셈 연산 기능 X



        다항식의 나눗셈을 기능을 구현하지 못했습니다. 처음에 생각했었던 것에 비해 포인터와
최종 반성   구조체의 사용에 대한 부분에서는 큰 문제가 없었던 반면에 다항식의 연산식 알고리즘을
        작성하는데 있어서 좀 더 어려움이 컸던 것 같습니다.




                            - 17 -

Contenu connexe

Similaire à 자료구조3보고서 (20)

자료구조 05 최종 보고서
자료구조 05 최종 보고서자료구조 05 최종 보고서
자료구조 05 최종 보고서
 
자료구조2보고서
자료구조2보고서자료구조2보고서
자료구조2보고서
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 Hwp
 
자료구조 02 최종 보고서
자료구조 02 최종 보고서자료구조 02 최종 보고서
자료구조 02 최종 보고서
 
2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)
 
2012 Dm B3 보고서(06박찬흥)
2012 Dm B3 보고서(06박찬흥)2012 Dm B3 보고서(06박찬흥)
2012 Dm B3 보고서(06박찬흥)
 
2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)
 
2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)
 
자료구조 Project4
자료구조 Project4자료구조 Project4
자료구조 Project4
 
자구4번
자구4번자구4번
자구4번
 
자료구조04
자료구조04자료구조04
자료구조04
 
자료구조 Project5
자료구조 Project5자료구조 Project5
자료구조 Project5
 
3. linked list
3. linked list3. linked list
3. linked list
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01
 
자료구조02
자료구조02자료구조02
자료구조02
 
2012 Ds 06
2012 Ds 062012 Ds 06
2012 Ds 06
 
이산치수학 Project7
이산치수학 Project7이산치수학 Project7
이산치수학 Project7
 
Object C - RIP
Object C - RIPObject C - RIP
Object C - RIP
 
이산치수학 Project4
이산치수학 Project4이산치수학 Project4
이산치수학 Project4
 
자료구조1보고서
자료구조1보고서자료구조1보고서
자료구조1보고서
 

Plus de KimChangHoen

자료구조5보고서
자료구조5보고서자료구조5보고서
자료구조5보고서
KimChangHoen
 
자료구조4보고서
자료구조4보고서자료구조4보고서
자료구조4보고서
KimChangHoen
 
자료구조6보고서
자료구조6보고서자료구조6보고서
자료구조6보고서
KimChangHoen
 
이산치7보고서
이산치7보고서이산치7보고서
이산치7보고서
KimChangHoen
 
이산치6보고서
이산치6보고서이산치6보고서
이산치6보고서
KimChangHoen
 
이산치5보고서
이산치5보고서이산치5보고서
이산치5보고서
KimChangHoen
 
이산치4보고서
이산치4보고서이산치4보고서
이산치4보고서
KimChangHoen
 
이산치3보고서
이산치3보고서이산치3보고서
이산치3보고서
KimChangHoen
 
이산치1보고서
이산치1보고서이산치1보고서
이산치1보고서
KimChangHoen
 

Plus de KimChangHoen (9)

자료구조5보고서
자료구조5보고서자료구조5보고서
자료구조5보고서
 
자료구조4보고서
자료구조4보고서자료구조4보고서
자료구조4보고서
 
자료구조6보고서
자료구조6보고서자료구조6보고서
자료구조6보고서
 
이산치7보고서
이산치7보고서이산치7보고서
이산치7보고서
 
이산치6보고서
이산치6보고서이산치6보고서
이산치6보고서
 
이산치5보고서
이산치5보고서이산치5보고서
이산치5보고서
 
이산치4보고서
이산치4보고서이산치4보고서
이산치4보고서
 
이산치3보고서
이산치3보고서이산치3보고서
이산치3보고서
 
이산치1보고서
이산치1보고서이산치1보고서
이산치1보고서
 

자료구조3보고서

  • 2. 과제수행일지 조원소개 C2 조 조장 박태원 소 속 자료조사 김창헌, 김정무 프로그래밍 김현호, 박가혜 과제수행기간 14 일 16 시간 주 제 연구제목 다항식의 연산 연결 리스트를 이용해 다항식을 입력받고, 이를 구현해 다항식의 연산을 실행함으로서 연결 연구배경 리스트의 개념과 그 장단점에 대해 이해하고 그것을 필요로 하는 부분에 시기적절하게 이용 할 수 있다. 참 고 자 료 C로 쓴 자료구조론(저자 : 이석호, 교보문고 2nd) C언어로 구현한 자료구조(저자 : 임형근, 정일출판사) 참고 서적 http://blog.naver.com/skout123?Redirect=Log&logNo=50134180161 : 단순 연결리스트 내용 참조 http://blog.naver.com/skout123?Redirect=Log&logNo=50134180161 : 이중 연결리스트 내용 참조 http://blog.naver.com/skout123?Redirect=Log&logNo=50134180161 : 원형 연결리스트 내용 참조 참고 URL http://croute.me/27 : 연결리스트를 이용한 다항식의 연산 소스 참조 과제의 수행 첫째날 2012 년 4 월 12 일 목요일 회의 주제 조원 자기소개 및 역할분담, 계획 작성 조장 : 박태원 자료조사 : 김창헌, 김정무 프로그래밍 : 김현호, 박가혜 미리 조사해온 연결리스트에 대한 개념을 정리하고 일정표를 작성하는 방향으로 진행되었 습니다. 첫 시간이기 때문에 조원들 각자가 연결리스트에 대한 개념을 알고, 과제 수행에 필요한 부분을 짚어 능동적으로 역할을 수행할 수 있게 하기 위해 함께 기본적인 내용에 대해 정리했습니다. 회의 내용 1. 연결 리스트 - 관계된 자료들의 순차적인 조직 상태를 연결필드를 사용해 나타내는 것으로 다음에 위 치할 자료가 기억장소 어디에 있는지 알려주는 연결필드를 보고 자료들의 관계를 추측 해낼 수 있다. 2. 연결 리스트의 구성요소 1) 노드 : 자료필드와 다음 자료가 있는 위치를 알려주는 연결 필드로 구성되어 있는 레 코드 형식의 구성체를 이야기하며 그 형태는 아래와 같다. - 1 -
  • 3. 2) 헤드 : 연결리스트의 처음을 가리키는 포인터 변수 3) 테일 : 연결리스트의 마지막 부분을 가리키며 연결필드 부분을 NULL 로 기술해 처리한다. 3. 단순 연결리스트의 구성방식 - 연결필드를 통해 이어져 있는 모습이 배열과 흡사하다. 4. 연결리스트를 통한 다항식의 구현 - 연결리스트를 이용해 다항식을 구현한다면 연결리스트를 구성하는 노드의 형태는 아래와 같다. 계수 필드 지수 필드 연결 필드 이상의 내용을 바탕으로 일정표를 작성하였으며 작성된 일정표의 내용에 따라 다음 주 화 요일 자료구조 시간까지 프로그래밍 팀은 C언어를 통해 직접 노드를 구현해보며 프로그램 초안의 틀을 만들고 조장과 자료조사팀은 연결리스트의 장단점과 이를 보완하기 위해 나타 난 연결리스트의 다른 형태에 대해 조사하고 다항식의 연산과 관련된 프로그램 소스에 대 해 조사해 오기로 하였습니다. 구조체나 포인터를 이용하는데 익숙하지 않아 해당 내용을 이해하는데 오랜 시간이 걸렸던 것 같습니다. 이를 해결하기 위해 자료조사 팀이 연결리스트에 대한 추가적인 내용을 조사 하는 동안 프로그래밍 팀이 직접 C언어로 연결리스트를 구현해 보면서 해당 내용에 대해 반성 공부하기로 했습니다. 둘째날 2012 년 4 월 17 일 화요일 회의주제 이중 연결리스트와 원형 연결리스트 회의내용 순차리스트(배열)과 대비된 연결리스트의 장단점과, 단순 연결리스트의 단점을 보완하기 위 해 만들어진 이중 연결리스트와 원형 연결리스트에 대한 내용을 프로그래밍 팀에게 알려주 - 2 -
  • 4. 는 방향으로 진행되었습니다. 1. 연결리스트의 장점 1) 동적인 기억장소 관리 - 그때그때 필요한 기억장소만큼을 배정받아 사용 사용하기 때문에 미리 여유로운 공간을 배정해 줘야 하는 배열에 비해 공간을 사용하는 효율이 높다. 2) 자료의 재배열이 빠르다 - 배열과 달리 리스트의 길이에 관계없이 연결필드 부분의 필드값을 변화시키는 것만 으로도 자료를 재배열 할 수 있다. 3) 리스트의 삭제조작이 빠르다 - 배열과 달리 많은 자료의 이동이 일어나지 않으며, 삭제조작이 일어나는 노드의 직 전 노드가 가진 연결 필드값을 바꿔주는 것만으로도 삭제 연산이 완료된다. 4) 리스트간의 결합이 쉽다 - 결합하고자 하는 리스트 간의 꼬리부분과 머리부분을 이어주는 것만으로 리스트의 결합이 완료된다. 2. 연결리스트의 단점 1) 노드의 검색이 느리다(접근성이 낮다) - 정해진 주소값을 입력해주면 곧바로 접근이 가능한 배열과 달리 헤드 부분부터 순 방식이기 때문에 배열에 비해 오랜 시간이 걸린다. 차적으로 검색해가며 접근하는 방식 2) 자료를 잃어버릴 가능성이 높다 - 연결리스트의 자료 구조가 복잡하기 때문에 연결 필드값을 조작하는데 실수가 발생 하면 대량의 자료를 잃어버릴 가능성 가능성이 있다. 3. 이중 연결리스트 - 위에서 언급된 연결리스트의 약점을 보완하기 위한 해결책으로 하나의 노드가 두 개 의 연결 필드 가져 양방향의 이동이 가능해졌다. 인접한 노드의 접근성이 높아 필드를 높아짐으 로서 특정 노드의 검색, 삭제에 있어 단순 연결리스트에 비해 효율적인 일처리가 가 능하다. - 이중 연결리스트의 형태는 아래와 같다. 4. 원형 연결리스트 - 3 -
  • 5. - 노드의 꼬리가 리스트의 헤드 부분을 가리키는 형태 계속해서 순환하는 원의 형태 형태로 를 가지게 되었다. 항상 처음부터 검색을 실행하는 단순 연결리스트와 달리 포인터가 가리키는 부분부터 검색을 실행 수 있어 효율이 높으며 그 효율을 극대화하기 위 실행할 해 보통 이중 연결리스트와 함께 사용 사용한다. - 원형 연결리스트의 형태는 아래와 같다. 프로그램 초안이 만들어지지 않아 프로그램에 대해 회의를 진행 할 수가 없었습니다. 연결 리스트의 장단점과 단점을 해결하기 위한 방안에 대한 학습 위주로 회의가 진행되었으며 목요일까지 덧셈식과 뺄셈식에 가능하다면 곱셈식까지 만들어진 소스를 만들어 회의를 진 반성 행하기로 하였습니다. 셋째날 2012 년 4 월 19 일 목요일 회의주제 프로그램 초안 확인, 개량안 제시 #include<stdio.h> #include <stdlib.h> #include <conio.h> typedef struct Node *polyPointer; polyPointer addPoly(polyPointer poly, int c, int e, polyPointer *tail); polyPointer addNode(polyPointer Link, int c, int e); polyPointer Input(); void printPoly(polyPointer p); polyPointer Add(polyPointer A, polyPointer B); polyPointer Mult(polyPointer A, polyPointer B); polyPointer Sub(polyPointer A,polyPointer B); 프로그램 초안 void xprint(int bb,polyPointer p); struct Node { int coef; int expon; polyPointer link; }; int main(void) { polyPointer P, S, T; int aa; - 4 -
  • 6. int bb; printf("첫번째 다항식 입력n"); P = Input(); printf("두번째 다항식 입력n"); S = Input(); printf("P = "); printPoly(P); printf("S = "); printPoly(S); T = Add(P, S); printf("n다항식 덧셈 결과 : ="); printPoly(T); T= Sub(P,S); printf("n다항식 뺄셈 결과 : ="); printPoly(T); getch(); } polyPointer Input() { polyPointer p = NULL; int coef, expon; while (coef != -1 && expon != -1) { printf(" 계수와 지수 입력 (종료시는 -1 -1 입력) : "); scanf("%d %d", &coef, &expon); if (expon != -1) p = addNode(p, coef, expon); } return p; } polyPointer addPoly(polyPointer poly, int c, int e, polyPointer *tail) { polyPointer Mono; Mono = (polyPointer)malloc(sizeof(struct Node)); Mono->expon = e; Mono->coef = c; if ( poly == NULL ) { poly = Mono; *tail = Mono; } else { (*tail)->link = Mono; *tail = Mono; } (*tail)->link = NULL; return poly; } polyPointer addNode(polyPointer Link, int c, int e) { polyPointer Mono, p; Mono = (polyPointer)malloc(sizeof(struct Node)); Mono->coef = c; Mono->expon = e; - 5 -
  • 7. Mono->link = NULL; if (Link == NULL) { Link = Mono; return Link; } p = Link; while (p->link != NULL) p = p->link; p->link = Mono; return Link; } polyPointer Add(polyPointer a, polyPointer b) { int sum; polyPointer r; polyPointer result; r = NULL; result = NULL; while ( a != NULL && b != NULL ) { if ( a->expon == b->expon ) { sum = a->coef + b->coef; if ( sum != 0 ) { result = addPoly(result, sum, a->expon, &r); } a = a->link; b = b->link; } else if ( a->expon < b->expon ) { result = addPoly(result, b->coef, b->expon, &r); b = b->link; } else if ( a->expon > b->expon ) { result = addPoly(result, a->coef, a->expon, &r); a = a->link; } } while ( a != NULL ) { result = addPoly(result, a->coef, a->expon, &r); a = a->link; } while ( b != NULL ) { result = addPoly(result, b->coef, b->expon, &r); b = b->link; } r->link = NULL; return result; } polyPointer Sub(polyPointer a, polyPointer b) { int sum; polyPointer r; polyPointer result; r = NULL; result = NULL; while ( a != NULL && b != NULL ) { if ( a->expon == b->expon ) { sum = a->coef - b->coef; if ( sum != 0 ) { result = addPoly(result, sum, a->expon, &r); - 6 -
  • 8. } a = a->link; b = b->link; } else if ( a->expon < b->expon ) { result = addPoly(result, -(b->coef), b->expon, &r); b = b->link; } else if ( a->expon > b->expon ) { result = addPoly(result, a->coef, a->expon, &r); a = a->link; } } while ( a != NULL ) { result = addPoly(result, a->coef, a->expon, &r); a = a->link; } while ( b != NULL ) { result = addPoly(result, -(b->coef), b->expon, &r); b = b->link; } r->link = NULL; return result; } void printPoly(polyPointer p) { while (p != NULL) { printf("%dx^%d", p->coef, p->expon); p = p->link; if (p != NULL && p->coef > 0) printf("+"); } printf("n"); } 덧셈과 뺄셈식까지는 구현을 마쳤으며 곱셈과 나눗셈식을 구현하는 방법에 대해 논의했습니다. 회의내용 while문을 이중으로 사용해 각 노드의 데이터값을 계산해 나가기로 하였으며 곱셈식에 대한 알고 리즘은 아래와 같습니다. - 7 -
  • 9. 만들어진 각각의 연결리스트에 포인터를 부여한다 다항식 P(x)를 가리키는 포인터의 값이 NULL을 가리킬 때까지 실행되는 while문을 구성하고 그 안에 S(x)를 가리키는 포인터의 값이 NULL을 가리킬 때까지 실행되는 while문을 하나 더 만들어 이중 while문의 형태를 잡는다. S(x)의 데이터값을 가리키는 포인터가 이동하는 동안 P(x)의 포인터가 가리키는 데이터값과 S(x)의 데이터값을 이용해 각각의 항의 곱을 구해 T(x)에 저장한다. S(x)의 포인터가 NULL을 가리키게 되면 S(x)의 포인터값을 초기화하고 P(x)의 반복한다. 포인터를 한칸 이동시킨 뒤 위의 과정을 반복한다. P(x)의 포인터가 NULL을 가리키면 T(x)를 반환하고 알고리즘을 종료한다. 조장과 프로그래밍팀은 해당 알고리즘을 c언어로 구현해보고, 자료조사팀은 계속해서 나눗셈 연산 식에 관련된 자료와 알고리즘을 찾아보기로 했습니다. P(x)에 관한 연산이 불가능하며, 다항식의 곱셈과 나눗셈 기능이 없습니다. => 곱셈 연산 알고리즘을 통한 곱셈 기능 추가 빼기 연산 과정 중에 논리오류 발생(계수가 부호가 들어가야 하는 부분에 +기호가 들어감) 문제점 => 논리 오류 제거 곱셈 연산에 대한 알고리즘의 틀을 잡고 나눗셈 연산의 알고리즘에 대해 논의했으나 좋은 반성 결과를 얻지 못했습니다. 우선 초안을 토대로 곱셈식과 뺄셈식을 응용한 알고리즘을 구상 해 보기로 하고 회의를 마쳤습니다. 넷째날 2012 년 4 월 24 일 화요일 회의주제 프로그램 보완 #include<stdio.h> #include <stdlib.h> #include <conio.h> typedef struct Node *polyPointer; polyPointer addPoly(polyPointer poly, int c, int e, polyPointer *tail); polyPointer addNode(polyPointer Link, int c, int e); 프로그램 polyPointer Input(); void printPoly(polyPointer p); 수정안 polyPointer Add(polyPointer A, polyPointer B); polyPointer Mult(polyPointer A, polyPointer B); polyPointer Sub(polyPointer A,polyPointer B); void xprint(int bb,polyPointer p); struct Node { int coef; int expon; polyPointer link; }; - 8 -
  • 10. int main(void) { polyPointer P, S, T; int aa; int bb; printf("첫번째 다항식 입력n"); P = Input(); printf("두번째 다항식 입력n"); S = Input(); printf("P = "); printPoly(P); printf("S = "); printPoly(S); T = Add(P, S); printf("n다항식 덧셈 결과 : ="); printPoly(T); T = Mult(P, S); printf("n다항식 곱셈 결과 : ="); printPoly(T); T= Sub(P,S); printf("n다항식 뺄셈 결과 : ="); printPoly(T); getch(); } polyPointer Input() { polyPointer p = NULL; int coef, expon; while (coef != -1 && expon != -1) { printf(" 계수와 지수 입력 (종료시는 -1 -1 입력) : "); scanf("%d %d", &coef, &expon); if (expon != -1) p = addNode(p, coef, expon); } return p; } polyPointer addPoly(polyPointer poly, int c, int e, polyPointer *tail) { polyPointer Mono; Mono = (polyPointer)malloc(sizeof(struct Node)); Mono->expon = e; Mono->coef = c; if ( poly == NULL ) { poly = Mono; *tail = Mono; } else { (*tail)->link = Mono; *tail = Mono; } (*tail)->link = NULL; return poly; - 9 -
  • 11. } polyPointer addNode(polyPointer Link, int c, int e) { polyPointer Mono, p; Mono = (polyPointer)malloc(sizeof(struct Node)); Mono->coef = c; Mono->expon = e; Mono->link = NULL; if (Link == NULL) { Link = Mono; return Link; } p = Link; while (p->link != NULL) p = p->link; p->link = Mono; return Link; } polyPointer Add(polyPointer a, polyPointer b) { int sum; polyPointer r; polyPointer result; r = NULL; result = NULL; while ( a != NULL && b != NULL ) { if ( a->expon == b->expon ) { sum = a->coef + b->coef; if ( sum != 0 ) { result = addPoly(result, sum, a->expon, &r); } a = a->link; b = b->link; } else if ( a->expon < b->expon ) { result = addPoly(result, b->coef, b->expon, &r); b = b->link; } else if ( a->expon > b->expon ) { result = addPoly(result, a->coef, a->expon, &r); a = a->link; } } while ( a != NULL ) { result = addPoly(result, a->coef, a->expon, &r); a = a->link; } while ( b != NULL ) { result = addPoly(result, b->coef, b->expon, &r); b = b->link; } r->link = NULL; return result; } polyPointer Sub(polyPointer a, polyPointer b) { int sum; - 10 -
  • 12. polyPointer r; polyPointer result; r = NULL; result = NULL; while ( a != NULL && b != NULL ) { if ( a->expon == b->expon ) { sum = a->coef - b->coef; if ( sum != 0 ) { result = addPoly(result, sum, a->expon, &r); } a = a->link; b = b->link; } else if ( a->expon < b->expon ) { result = addPoly(result, -(b->coef), b->expon, &r); b = b->link; } else if ( a->expon > b->expon ) { result = addPoly(result, a->coef, a->expon, &r); a = a->link; } } while ( a != NULL ) { result = addPoly(result, a->coef, a->expon, &r); a = a->link; } while ( b != NULL ) { result = addPoly(result, -(b->coef), b->expon, &r); b = b->link; } r->link = NULL; return result; } polyPointer Mult(polyPointer a, polyPointer b) { polyPointer r; polyPointer C; polyPointer result; C = NULL; while ( b != NULL ) { r = NULL; result = NULL; while ( a != NULL ) { result = addPoly(result, a->coef*b->coef, a->expon+b->expon, &r); a = a->link; } C = Add(C, result); b = b->link; } return C; } void printPoly(polyPointer p) { while (p != NULL) { printf("%dx^%d", p->coef, p->expon); p = p->link; - 11 -
  • 13. if (p != NULL && p->coef > 0) printf("+"); } printf("n"); } polyPointer Mult(polyPointer A, polyPointer B)를 통해 다항식의 곱셈연산이 가능하도 록 기능을 추가했습니다. 나눗셈 연산 알고리즘에 대한 의견이 제시되었지만 실제 다항식 의 나눗셈 연산과는 관계없는 알고리즘이 되어 기각되었으며 다항식의 x에 임의의 값을 대 입해 연산할 수 있는 알고리즘을 우선적으로 추가할 수 있도록 하자고 결론지었습니다. 다 항식의 연산 알고리즘은 아래와 같습니다. 부여한다. 다항식을 의미하는 연결리스트에 포인터를 부여한다. 회의내용 다항식 P(x)의 x값을 입력받으면, x의 값을 포인터가 가리키는 노드의 지수값 만큼 더해준다. 반복하여 곱해주고 계수값을 곱해준 후 미리 정해준 변수값에 더해준다. P(x)의 포인터가 NULL값을 가리키면 변수값을 반환하고 알고리즘을 종료한다. 나눗셈 연산 기능 X 다항식의 x에 임의의 값을 대입해 연산하는 기능 X (해결) 문제점 다항식에 임의의 값을 대입해 연산하는 알고리즘을 작성하였으며 스위치나 if문을 이용해 필요한 연산을 골라서 실행할 수 있도록 프로그램을 보완하기로 했습니다. 나눗셈 연산에 대해서는 남은 시간동안 조원들 각자가 알고리즘이 떠오르는 대로 조원들에게 알리고 해당 반성 알고리즘을 구현해 실험해 보기로 하였습니다. 결과 발표 #include<stdio.h> #include <stdlib.h> #include <conio.h> typedef struct Node *polyPointer; polyPointer addPoly(polyPointer poly, int c, int e, polyPointer *tail); polyPointer addNode(polyPointer Link, int c, int e); polyPointer Input(); void printPoly(polyPointer p); polyPointer Add(polyPointer A, polyPointer B); 프로그램 소스 polyPointer Mult(polyPointer A, polyPointer B); polyPointer Sub(polyPointer A,polyPointer B); void xprint(int bb,polyPointer p); struct Node { int coef; int expon; polyPointer link; }; int main(void) { - 12 -
  • 14. polyPointer P, S, T; int aa; int bb; printf("첫번째 다항식 입력n"); P = Input(); printf("두번째 다항식 입력n"); S = Input(); printf("P = "); printPoly(P); printf("S = "); printPoly(S); printf("원하는 연산을 입력하시오 1.덧셈, 2.곱셈, 3.뺄셈 : n"); scanf("%d",&aa); getch(); printf("다항식 P(x)를 계산하는데 사용할 x의 값을 입력하시오 : "); scanf("%d",&bb); xprint(bb,P); if(aa==1) {T = Add(P, S); printf("n다항식 덧셈 결과 : ="); printPoly(T);} if(aa==2) {T = Mult(P, S); printf("n다항식 곱셈 결과 : ="); printPoly(T); } if(aa==3) {T= Sub(P,S); printf("n다항식 뺄셈 결과 : ="); printPoly(T);} printf("다항식 T(x)를 계산하는데 사용할 x의 값을 입력하시오 : "); scanf("%d",&bb); xprint(bb,T); getch(); } polyPointer Input() { polyPointer p = NULL; int coef, expon; while (coef != -1 && expon != -1) { printf(" 계수와 지수 입력 (종료시는 -1 -1 입력) : "); scanf("%d %d", &coef, &expon); if (expon != -1) p = addNode(p, coef, expon); } return p; } polyPointer addPoly(polyPointer poly, int c, int e, polyPointer *tail) { polyPointer Mono; Mono = (polyPointer)malloc(sizeof(struct Node)); Mono->expon = e; Mono->coef = c; if ( poly == NULL ) { poly = Mono; *tail = Mono; } else { (*tail)->link = Mono; *tail = Mono; - 13 -
  • 15. } (*tail)->link = NULL; return poly; } polyPointer addNode(polyPointer Link, int c, int e) { polyPointer Mono, p; Mono = (polyPointer)malloc(sizeof(struct Node)); Mono->coef = c; Mono->expon = e; Mono->link = NULL; if (Link == NULL) { Link = Mono; return Link; } p = Link; while (p->link != NULL) p = p->link; p->link = Mono; return Link; } polyPointer Add(polyPointer a, polyPointer b) { int sum; polyPointer r; polyPointer result; r = NULL; result = NULL; while ( a != NULL && b != NULL ) { if ( a->expon == b->expon ) { sum = a->coef + b->coef; if ( sum != 0 ) { result = addPoly(result, sum, a->expon, &r); } a = a->link; b = b->link; } else if ( a->expon < b->expon ) { result = addPoly(result, b->coef, b->expon, &r); b = b->link; } else if ( a->expon > b->expon ) { result = addPoly(result, a->coef, a->expon, &r); a = a->link; } } while ( a != NULL ) { result = addPoly(result, a->coef, a->expon, &r); a = a->link; } while ( b != NULL ) { result = addPoly(result, b->coef, b->expon, &r); b = b->link; } r->link = NULL; return result; } polyPointer Sub(polyPointer a, polyPointer b) { int sub; polyPointer r; polyPointer result; - 14 -
  • 16. r = NULL; result = NULL; while ( a != NULL && b != NULL ) { if ( a->expon == b->expon ) { sub = a->coef - b->coef; if ( sub != 0 ) { result = addPoly(result, sub, a->expon, &r); } a = a->link; b = b->link; } else if ( a->expon < b->expon ) { result = addPoly(result, b->coef, b->expon, &r); b = b->link; } else if ( a->expon > b->expon ) { result = addPoly(result, a->coef, a->expon, &r); a = a->link; } } while ( a != NULL ) { result = addPoly(result, a->coef, a->expon, &r); a = a->link; } while ( b != NULL ) { result = addPoly(result, -(b->coef), b->expon, &r); b = b->link; } r->link = NULL; return result; } polyPointer Mult(polyPointer a, polyPointer b) { polyPointer r; polyPointer C; polyPointer result; C = NULL; while ( b != NULL ) { r = NULL; result = NULL; while ( a != NULL ) { result = addPoly(result, (a->coef*b->coef), (a->expon+b->expon), &r); a = a->link; } C = Add(C, result); b = b->link; } return C; } void xprint(int bb,polyPointer p) { int bbb=1; int sum=0; int i; int yy,jj; while (p!=NULL ) { yy=p->coef; jj=p->expon; - 15 -
  • 17. for(i=0;i<jj;i++) { bbb*=bb; } sum+=bbb*yy; p = p->link; bbb=1; } printf("n"); printf("다항식의 값은 : %d ",sum); } void printPoly(polyPointer p) { while (p != NULL) { printf("%dx^%d", p->coef, p->expon); p = p->link; if (p != NULL && p->coef > 0) printf("+"); } printf("n"); } 1. 다항식의 덧셈과 뺄셈 만들어진 각각의 연결리스트에 포인터를 부여하고, 각각의 포인터가 가리키는 노드의 expon값을 비교한다. 양쪽 항의 지수값이 같을 P(x)의 지수값이 클 때, S(x)의 지수값이 클 때, 때는 각 항의 계수를 더한 포인터가 가리키는 P(x) 포인터가 가리키는 P(x) 값과 지수값을 T(x)에 노드가 가진 값을 T(x)에 노드가 가진 값을 S(x)에 저장한다. 이후 각각의 저장하고 포인터를 한칸 저장하고 포인터를 한칸 항을 가리키는 포인터를 이동시킨 후 이전의 이동시킨 후 이전의 한칸씩 이동하고 이전의 동작을 실행한다. 실행한다. 동작을 실행한다. 실행한다. 실행한다. 동작을 실행한다. 둘 중 한쪽 연결리스트의 포인터가 가리키는 값이 NULL이 되면 다른 한쪽 연결리스트의 남은 노드값을 T(x)에 저장하고 알고리즘을 종료한다. 알고리즘 개요 2. 다항식의 곱셈 만들어진 각각의 연결리스트에 포인터를 부여한다 다항식 P(x)를 가리키는 포인터의 값이 NULL을 가리킬 때까지 실행되는 while문을 구성하고 그 안에 S(x)를 가리키는 포인터의 값이 NULL을 가리킬 때까지 실행되는 while문을 하나 더 만들어 이중 while문의 형태를 잡는다. S(x)의 데이터값을 가리키는 포인터가 이동하는 동안 P(x)의 포인터가 가리키는 데이터값과 S(x)의 데이터값을 이용해 각각의 항의 곱을 구해 T(x)에 저장한다. S(x)의 포인터가 NULL을 가리키게 되면 S(x)의 포인터값을 초기화하고 P(x)의 반복한다. 포인터를 한칸 이동시킨 뒤 위의 과정을 반복한다. P(x)의 포인터가 NULL을 가리키면 T(x)를 반환하고 알고리즘을 종료한다. - 16 -
  • 18. 3. 다항식의 연산 부여한다. 다항식을 의미하는 연결리스트에 포인터를 부여한다. 다항식 P(x)의 x값을 입력받으면, x의 값을 포인터가 가리키는 노드의 지수값 만큼 더해준다. 반복하여 곱해주고 계수값을 곱해준 후 미리 정해준 변수값에 더해준다. P(x)의 포인터가 NULL값을 가리키면 변수값을 반환하고 알고리즘을 종료한다. 구동 화면 문제점 나눗셈 연산 기능 X 다항식의 나눗셈을 기능을 구현하지 못했습니다. 처음에 생각했었던 것에 비해 포인터와 최종 반성 구조체의 사용에 대한 부분에서는 큰 문제가 없었던 반면에 다항식의 연산식 알고리즘을 작성하는데 있어서 좀 더 어려움이 컸던 것 같습니다. - 17 -