자료구조 Project3

575 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
575
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

자료구조 Project3

  1. 1. 과제수행일지 소속 조원 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 고참고자료 -> 링크드 리스트의 정의와 종류 UR http://blog.naver.com/skout123?Redirect=Log&logNo=50134180161 L -> 연결리스트와 용어에 대한 설명, 사진 (본문에 포함) II. 계획의 실행첫째 날 2012 년 4 월 12 일 목요일오늘의 계획수립 및 역할 분담 작업
  2. 2. 조장 : 최완철 자료조사 : 강승우, 김남희 프로그래밍 : 고충욱, 정준용토의 내용 위와 같이 조원의 업무 분담을 하였으며, 3 번째 과제와 관련된 링크드 리스트에 대한 자료조사를 최우선적으로 하기로 했다. 그리고 역할 분담은 각자가 하고 싶은 역할 위주로 정하였다.과제준비 첫날에 아무것도 모르는 상황이라서 토의 진행이 되지 않았었다. 에서 그 때문에 사전 자료조사의 중요성을 느끼게 되었다.느낀 점둘째 날 2012 년 4 월 17 일 화요일오늘의 링크드 리스트에 대한 자료를 이용하여 개념 이해 및 소스 구현방법 이해 작업 링크드 리스트 과제를 수행하기 위해서는 개념 이해가 중요하다고 느꼈다. 그래서 자료조사팀에서 조사한 내용을 가지고 이해하였다.토의 내용
  3. 3. 과제준비 링크드 리스트의 개념과 구조를 알게 되었으나, 소스로 구현하게 된다면 예상하지 못한 에서 문제들이 발생할 것 같다고 느꼈다.느낀 점셋째 날 2012 년 4 월 19 일 목요일오늘의 소스 초안 확인 및 개선방향 설정 작업 소스초안에서는 다항식 연산에서 덧셈과 뺄셈만 구현하였다.토의 내용 소스 초안의 연산 과정에 있어서 특별한 문제는 없었다.
  4. 4. 아직 곱셈과 나눗셈 연산은 구현하지 못했기 때문에 이 부분에 대해서 초안에 추가적으로 구현을 하기로 하였다.과제준비 곱셈 및 나눗셈 연산에서 지수가 같은 경우를 걸러내는 방법을 구현하는데 난관을 에서 겪었다.느낀 점 곱셈과 나눗셈에 대한 더 많은 공부가 필요하다고 느끼게 되었다.넷째 날 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)
  5. 5. {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;}
  6. 6. 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);
  7. 7. 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> typedef struct ListNode { float coef; int expon; 2안 struct ListNode *link; } ListNode; typedef struct ListHeader { int length; ListNode *head; ListNode *tail; } ListHeader;
  8. 8. 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("지수를 입력하시오.(정수) ");
  9. 9. 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)
  10. 10. {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("감사합니다.");elseprintf("잘못입력하였습니다.");system("PAUSE");}
  11. 11. 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;
  12. 12. }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);
  13. 13. 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);
  14. 14. 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;
  15. 15. 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;
  16. 16. 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. 결과
  17. 17. #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;
  18. 18. 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);
  19. 19. 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){
  20. 20. 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("감사합니다.");elseprintf("잘못입력하였습니다.");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){
  21. 21. 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;
  22. 22. 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)
  23. 23. 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;
  24. 24. }}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;
  25. 25. 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);
  26. 26. if (p->link == NULL){printf("%c%c",8,8);}}free_poly(plist);}
  27. 27. 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. 곱셈 연산 (문제점)
  28. 28. Ⅳ. 반성과제를 연결 리스트에 대해 많이 알게 되었지만, 과제를 확실하게 마무리 하지 못해 아쉬운마치면서 점이 많이 남는 프로젝트였습니다.느낀 점 사전 자료조사에 대한 중요성을 다시 한번 알게 되었습니다.

×