Top Banner
과과과과과과 과과 과과 B2 조조 : 조조조 조조조조 : 조조조, 조조조 조조조조조 : 조조조, 조조조 과과과과과과 3조 I. 과과과 과과 과과과과 Linked List 과과과과 조조조 조조조 조조 조조조 조조, Linked List 조 조조조 조조, 조조조 조조조조조조 조조조 조조조조 조조조조 조조. 과과과과 과과 URL http://ko.wikipedia.org/wiki/%EB%A7%81%ED%81%AC%EB%93%9C_%EB %A6%AC%EC%8A%A4%ED%8A%B8 -> 조조조 조조조조 조조조 조조 http://blog.naver.com/skout123?Redirect=Log&logNo=50134180161 -> 조조조조조조 조조조 조조 조조, 조조 (조조조 조조) II. 과과과 과과 과과 과 2012 조 4 조 12 조 조조조 과과과 과과 조조조조 조 조조 조조 과과 과과 조조 : 조조조 조조조조 : 조조조, 조조조 조조조조조 : 조조조, 조조조 조조 조조 조조조 조조 조조조 조조조조, 3 조조 조조조 조조조 조조조 조조조조 조조 조조조조조 조조조조조조 조조조 조조. 조조조 조조 조조조 조조조 조조 조조 조조 조조조 조조조조.
22

자료구조 Project3

Jun 12, 2015

Download

Documents

KoChungWook
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 자료구조 Project3

과제수행일지소속 조원

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

과제수행

기간3 일

I. 계획의 작성

연구제목Linked List

연구배경학습한 내용에 대해 이해를 하고, Linked List 의 정의를 알고,

이것을 프로그램으로 만들어 봄으로써 활용법을 안다.

참고자료

UR

L

http://ko.wikipedia.org/wiki/%EB%A7%81%ED%81%AC%EB%93%9C_%EB

%A6%AC%EC%8A%A4%ED%8A%B8

-> 링크드 리스트의 정의와 종류

http://blog.naver.com/skout123?Redirect=Log&logNo=50134180161

-> 연결리스트와 용어에 대한 설명, 사진 (본문에 포함)

II. 계획의 실행

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

오늘의

작업계획수립 및 역할 분담

Page 2: 자료구조 Project3

토의

내용

조장 : 최완철

자료조사 : 강승우, 김남희

프로그래밍 : 고충욱, 정준용

위와 같이 조원의 업무 분담을 하였으며, 3 번째 과제와 관련된 링크드 리스트에 대한

자료조사를 최우선적으로 하기로 했다.

그리고 역할 분담은 각자가 하고 싶은 역할 위주로 정하였다.

과제준비

에서

느낀 점

첫날에 아무것도 모르는 상황이라서 토의 진행이 되지 않았었다.

그 때문에 사전 자료조사의 중요성을 느끼게 되었다.

둘째 날 2012 년 4 월 17 일 화요일

오늘의

작업링크드 리스트에 대한 자료를 이용하여 개념 이해 및 소스 구현방법 이해

토의

내용

링크드 리스트 과제를 수행하기 위해서는 개념 이해가 중요하다고 느꼈다.

그래서 자료조사팀에서 조사한 내용을 가지고 이해하였다.

Page 3: 자료구조 Project3

과제준비

에서

느낀 점

링크드 리스트의 개념과 구조를 알게 되었으나, 소스로 구현하게 된다면 예상하지 못한

문제들이 발생할 것 같다고 느꼈다.

셋째 날 2012 년 4 월 19 일 목요일

오늘의

작업소스 초안 확인 및 개선방향 설정

토의

내용

소스초안에서는 다항식 연산에서 덧셈과 뺄셈만 구현하였다.

소스 초안의 연산 과정에 있어서 특별한 문제는 없었다.

아직 곱셈과 나눗셈 연산은 구현하지 못했기 때문에 이 부분에 대해서 초안에 추가적으로

구현을 하기로 하였다.

과제준비곱셈 및 나눗셈 연산에서 지수가 같은 경우를 걸러내는 방법을 구현하는데 난관을 겪었다.

Page 4: 자료구조 Project3

에서

느낀 점곱셈과 나눗셈에 대한 더 많은 공부가 필요하다고 느끼게 되었다.

넷째 날 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++;

}

Page 5: 자료구조 Project3

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 %d\n", 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);

Page 6: 자료구조 Project3

insert_node_last(&list2, 10,6);

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

poly_print(&list3);

}

문제점 덧셈 연산만 가능함

해결

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

다섯째

날2012 년 4 월 25 일 수요일

오늘의

작업2 안 소스 확인 및 개선 방향 설정

2 안 #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;

Page 7: 자료구조 Project3

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. 끝내기\n\n");

Page 8: 자료구조 Project3

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);

}

Page 9: 자료구조 Project3

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;

}

Page 10: 자료구조 Project3

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

{

Page 11: 자료구조 Project3

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; )

Page 12: 자료구조 Project3

{

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. 결과

Page 13: 자료구조 Project3

최종

프로그램

소스

#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);

Page 14: 자료구조 Project3

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. 끝내기\n\n");

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);

}

Page 15: 자료구조 Project3

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;

Page 16: 자료구조 Project3

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);

Page 17: 자료구조 Project3

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;

Page 18: 자료구조 Project3

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)

{

Page 19: 자료구조 Project3

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. 곱셈 연산 ( 문제점 )

Page 20: 자료구조 Project3

Ⅳ. 반성

과제를

마치면서

느낀 점

연결 리스트에 대해 많이 알게 되었지만, 과제를 확실하게 마무리 하지 못해 아쉬운 점이

많이 남는 프로젝트였습니다.

사전 자료조사에 대한 중요성을 다시 한번 알게 되었습니다.