22
과과과과과과 과과 과과 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 조조 조조조 조조조 조조조 조조조조 조조 조조조조조 조조조조조조 조조조 조조. 조조조 조조 조조조 조조조 조조 조조 조조 조조조 조조조조.

자료구조 Project3

Embed Size (px)

Citation preview

과제수행일지소속 조원

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 일 목요일

오늘의

작업계획수립 및 역할 분담

토의

내용

조장 : 최완철

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

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

위와 같이 조원의 업무 분담을 하였으며, 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 %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);

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;

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

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

}

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

Ⅳ. 반성

과제를

마치면서

느낀 점

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

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

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