자료구조 Project3
Upcoming SlideShare
Loading in...5
×
 

자료구조 Project3

on

  • 498 views

 

Statistics

Views

Total Views
498
Views on SlideShare
498
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft Word

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

자료구조 Project3 자료구조 Project3 Document Transcript

  • 과제수행일지 소속 조원 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 일 목요일오늘의 계획수립 및 역할 분담 작업
  • 조장 : 최완철 자료조사 : 강승우, 김남희 프로그래밍 : 고충욱, 정준용토의 내용 위와 같이 조원의 업무 분담을 하였으며, 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> typedef struct ListNode { float coef; int expon; 2안 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("감사합니다.");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){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("감사합니다.");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){
  • 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. 곱셈 연산 (문제점)
  • Ⅳ. 반성과제를 연결 리스트에 대해 많이 알게 되었지만, 과제를 확실하게 마무리 하지 못해 아쉬운마치면서 점이 많이 남는 프로젝트였습니다.느낀 점 사전 자료조사에 대한 중요성을 다시 한번 알게 되었습니다.