씨언어 초보인데요 ㅠㅠ
지금 코드를 짜고 있는데 기본적인 SYNNTAX 오류가 나는데 제가 부족한 탓에 이해가 되지를 않네요 ㅠㅠ
지금 짜고 있는 것은 실수를 리스트노드로 받아서 재귀 연산을 하는 것인데 잘 모르겠네요 ㅠㅠ
#include //
#include
#define MAX 100
typedef char element;
typedef struct ListNode {
element data;
struct ListNode *link;
} ListNode;
ListNode *create_node(element data, ListNode *link);
void insert_node(ListNode **phead, ListNode *p, ListNode *new_node);
void display(ListNode *head);
void error(char *message);
int fibonatorial(unsigned int n);
ListNode add_list(ListNode *head1, ListNode *head2);
ListNode multiply(ListNode *head1, ListNode *head2);
int ListToReal(ListNode *head);
ListNode RealToList(int num);
void main()
{
ListNode *list1=NULL, *list2=NULL, *temp=NULL;
char num0[MAX];
int i,j,k;
int num=0;
for(i=0; i
{
num0[i]=0;
}
printf("fibonatorial 함수 S(n)에서 구하고 싶은 값을 입력하세요 : ");
scanf("%n", &num);
for(i=0; i
{
if(num0[i] == NULL)
{
j=i;
}
}
for(i=j; i>=0; i--) //
{
insert_node(&list1, NULL, create_node(num0[i], NULL));
}
printf("\n");
printf("S[n]=");
temp = list1;
for(i=0; i
{
if(temp->data==NULL)
break;
printf("%c",temp->data);
temp=temp->link;
}
printf("\n");
add_list(list1, list2);
}
ListNode add_list(ListNode *head1, ListNode *head2)
{
ListNode *temp1=NULL, *temp2=NULL, *temp3=NULL, *sum=NULL;
int i,j,k;
int carry=0;
int n_index1=0, n_index2=0;//n1->list1의 정수부, n2->list2의 정수부
int f_index1=0, f_index2=0;//f1->list1의 소수부, f2->list2의 소수부
temp1=head1;
temp2=head2;
for(i=0; i
{
if(temp1->link->data==NULL)
{
f_index1=i-n_index1;
break;
}else if(temp1->data=='.')
{
n_index1=i;
}
temp1=temp1->link;
}
for(i=0; i
{
if(temp2->link->data==NULL)
{
f_index2=i-n_index2;
break;
}
else if(temp2->data=='.')
{
n_index2=i;
}
temp2=temp2->link;
}
temp1=head1;
temp2=head2;
printf("\n");
//소수끝자리부부터 더하기연산수행
temp1=head1;
temp2=head2;
while(f_index1>f_index2) //f_index1이 클경우
{
temp1=head1;
temp2=head2;
for(i=0;i
{
temp1=temp1->link;
}
for(i=0;i
{
temp2=temp2->link;
}
insert_node(&sum, NULL, create_node(temp1->data, NULL));
f_index1-=1;
}
while(f_index1
{
temp1=head1;
temp2=head2;
for(i=0;i
{
temp2=temp2->link;
}
insert_node(&sum, NULL, create_node(temp2->data, NULL));
f_index2-=1;
}
while((f_index1>0) || (f_index2>0)) //add to f_index=0
{
temp1=head1;
temp2=head2;
for(i=0;i
{
temp1=temp1->link;
}
for(i=0;i
{
temp2=temp2->link;
}
if(carry==0)
{
if((temp1->data + temp2->data)-48 >= 58)
{
insert_node(&sum, NULL, create_node((temp1->data + temp2->data-48)-10, NULL));
carry=1;
}
else if((temp1->data + temp2->data)-48 < 58)
{
insert_node(&sum, NULL, create_node((temp1->data + temp2->data-48), NULL));
carry=0;
}
f_index1-=1;
f_index2-=1;
}
else if(carry==1)
{
if((temp1->data + temp2->data)-48 >= 58)
{
insert_node(&sum, NULL, create_node((temp1->data + temp2->data-48)-9, NULL));
carry=1;
}
else if((temp1->data + temp2->data)-48 < 58)
{
insert_node(&sum, NULL, create_node((temp1->data + temp2->data-48)+1, NULL));
carry=0;
}
f_index1-=1;
f_index2-=1;
}
}
insert_node(&sum, NULL, create_node( '.' , NULL));
while((n_index1>0) && (n_index2>0))
{
temp1=head1;
temp2=head2;
for(i=0;i
{
temp1=temp1->link;
}
for(i=0;i
{
temp2=temp2->link;
}
if(carry==0)
{
if( (temp1->data+temp2->data)-48 >= 58)
{
insert_node(&sum, NULL, create_node((temp1->data + temp2->data-48)-10, NULL));
carry=1;
}
else if((temp1->data + temp2->data)-48 < 58)
{
insert_node(&sum, NULL, create_node((temp1->data + temp2->data-48), NULL));
carry=0;
}
n_index1-=1;
n_index2-=1;
}
else if(carry==1)
{
if((temp1->data + temp2->data)-48 >= 58)
{
insert_node(&sum, NULL, create_node((temp1->data + temp2->data-48)-9, NULL));
carry=1;
}
else if((temp1->data + temp2->data)-48 < 58)
{
insert_node(&sum, NULL, create_node((temp1->data + temp2->data-48)+1, NULL));
carry=0;
}
n_index1-=1;
n_index2-=1;
}
}
while(n_index1>0)//f_index1이 클경우
{
temp1=head1;
temp2=head2;
for(i=0;i
{
temp1=temp1->link;
}
if(carry==1)
{
insert_node(&sum, NULL, create_node(temp1->data, NULL));
carry=0;
}
else if(carry==0)
{
insert_node(&sum, NULL, create_node(temp1->data+1, NULL));
}
n_index1-=1;
}
while(n_index2>0)//f_index2이 클경우
{
temp1=head1;
temp2=head2;
for(i=0;i
{
temp2=temp2->link;
}
if(carry==1)
{
insert_node(&sum, NULL, create_node(temp2->data+1, NULL));
carry=0;
}
else if(carry==0)
{
insert_node(&sum, NULL, create_node(temp2->data, NULL));
}
n_index2-=1;
}
return *sum;
}
void error(char *message)
{
fprintf(stderr,"%s\n",message);
exit(1);
}
void insert_node(ListNode **phead, ListNode *p, ListNode *new_node)
{
if( *phead == NULL ) // 공백리스트인 경우
{
new_node->link = NULL;
*phead = new_node;
}
else if( p == NULL ) // p가 NULL이면 첫번째 노드로 삽입
{
new_node->link = *phead;
*phead = new_node;
}
else // p 다음에 삽입
{
new_node->link = p->link;
p->link = new_node;
}
}
void display(ListNode *head)
{
ListNode *p=head;
printf("%c", p->data);
}
ListNode *create_node(element data, ListNode *link) // 노드를 동적으로 생성하는 프로그램
{
ListNode *new_node;
new_node = (ListNode *)malloc(sizeof(ListNode));
if( new_node == NULL ) error("메모리 할당 에러");
new_node->data = data;
new_node->link = link;
return(new_node);
}
ListNode Fibonatorial(ListNode *head) // Fibonatorial 함수 선언.
{
int n = ListToReal(head); // 입력받은 리스트노드의 헤드를 실수로 변환시켜 n에 저장.
ListNode *zero, *temp;
if(n == 0) // if반복문. n이 0일 때.
{
zero = (ListNode *)malloc(sizeof(ListNode)); //
zero->data=0;
zero->link=NULL;
return *zero;
}
else if(n%2 == 0) // n이 짝수 일 때.
{
*temp = RealToList(n-1);
return multiply(Fibonatorial(*temp), head); // Fibonatorial(n)=Fibonatorial(n-1)*n.
}
else if(n%2 == 1) // n이 홀수 일 때.
{
*temp= RealToList(n-1);
return add_list(Fibonatorial(*temp), head); // Fibonatorial(n)=Fibonatorial(n-1)+n.
}
}
ListNode multiply(ListNode *head, ListNode *numb)
{
ListNode *temp1=NULL, *temp2=NULL, *multifly=NULL;
int num,i,j,k;
temp1=head;
temp2=head;
num=ListToReal(numb);
for(i=0; i
{
*temp2 = add_list(temp2, head);
}
return *temp2;
}
int ListToReal(ListNode *ToBeReal) // 리스트노드를 실수로 변환해주는 함수 ListToReal.
{
ListNode *temp=NULL;
int i, j, num;
temp=ToBeReal;
while(temp!=NULL)
{
j++;
temp=temp->link;
}
temp=ToBeReal;
for(i=0; i
{
num+=( (temp->data) * (10^i) ); // data 값에 10^i를 곱하여 실수화시킨다
temp=temp->link;
}
return num; // 변환된 값 num을 반환.
}
ListNode RealToList(int num) // 실수를 리스트노드로 변환해주는 함수 RealToList
{
ListNode *WannaBeList=NULL;
int i;
for(i=0; i
{
WannaBeList->data=num%10;
num=num/10;
}
return *WannaBeList;
}
코드도 길고, 게다가 indentation도 없어서
코드도 길고, 게다가 indentation도 없어서 보기가 어렵네요.. ^^;
오류가 나는 부분을 말씀해 주시면 답변을 얻으시기가 훨씬 나으실 것 같아요~~
==============================
꿈꾸는소년
아까 답글을 달까 말까 하다가...
그래도 한번 무슨 코드인가 한번 훑어나 보자 하고 봤는데...
ctrl + c,v가 엉뚱하게 된건지 의도한건지 문법이며 괄호 맞추는거며 아무것도 맞지 않아서
걍 무시했었습니다. 맨 마지막 realtolist 라는 함수구문만 봐고 중괄호 쌍이 맞지도 않으며
가운데 for 문에는 아예 괄호가 빠져있죠.
이런 코드를 가져와 질문이라고 올려놓는게 정말 무성의하다고 느껴지네요.
요즘 이상하게 이따위로 사람 신경 긁어놓는 질문글이 부쩍 늘어났네요...
봄이 되서 그런가....
고민이 많아 고민인 애늙은이 입니다.
어렵겠네요.
그럼 쉽게 볼까요.
일단. 되는코드를 볼까요.
보통은 STL같이 성능좋고 잘 정리된 라이브러리를 사용하지만.
익명님처럼 함수.로 리스트를 구현하거나
저처럼 함수 + 클래스로 링크드 리스트를 구현해보는것도 바람직하다보 봅니다.
일단 되는 소스로 break point 찍어가면서 어떻게 만들었는지 해보신후에
조금씩 따라서 재구현해보시면 이해도 되고 구현도 되실겁니다.
빌드가 되는 소스' 최대한 오류가 없는 소스'를 구해서
따라 만들어 보시는게 가장 좋습니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기