씨언어 초보인데요 ㅠㅠ

익명 사용자의 이미지

지금 코드를 짜고 있는데 기본적인 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;
}

divetou의 이미지

코드도 길고, 게다가 indentation도 없어서 보기가 어렵네요.. ^^;

오류가 나는 부분을 말씀해 주시면 답변을 얻으시기가 훨씬 나으실 것 같아요~~

==============================
꿈꾸는소년

dingkyu의 이미지

그래도 한번 무슨 코드인가 한번 훑어나 보자 하고 봤는데...
ctrl + c,v가 엉뚱하게 된건지 의도한건지 문법이며 괄호 맞추는거며 아무것도 맞지 않아서
걍 무시했었습니다. 맨 마지막 realtolist 라는 함수구문만 봐고 중괄호 쌍이 맞지도 않으며
가운데 for 문에는 아예 괄호가 빠져있죠.

이런 코드를 가져와 질문이라고 올려놓는게 정말 무성의하다고 느껴지네요.

요즘 이상하게 이따위로 사람 신경 긁어놓는 질문글이 부쩍 늘어났네요...
봄이 되서 그런가....

고민이 많아 고민인 애늙은이 입니다.

shint의 이미지

그럼 쉽게 볼까요.

#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);
ListNode add_list(ListNode *head1, ListNode *head2);
 
 
//함수 사용방법
char num0[MAX];
ListNode *list1=NULL, *list2=NULL, *temp=NULL;
insert_node(&list1, NULL, create_node(num0[i], NULL));
add_list(list1, list2);
insert_node(&sum, NULL, create_node( '.' , NULL));
insert_node(&sum, NULL, create_node((temp1->data + temp2->data-48)-10, NULL));
insert_node(&sum, NULL, create_node((temp1->data + temp2->data-48), NULL));
insert_node(&sum, NULL, create_node((temp1->data + temp2->data-48)-9, NULL));
insert_node(&sum, NULL, create_node((temp1->data + temp2->data-48)+1, NULL));
insert_node(&sum, NULL, create_node(temp1->data, NULL));
insert_node(&sum, NULL, create_node(temp2->data, NULL));
insert_node(&sum, NULL, create_node(temp1->data+1, NULL));
insert_node(&sum, NULL, create_node(temp2->data+1, NULL));
 
//노드를 동적으로 생성
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);
}
//생성된 노드를 삽입
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;
    }
}
//리스트에 노드를 추가 - 이건 코드가 매우 어렵네요.
//아마 코드가 잘못된거 같습니다.
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; ilink->data==NULL)
    {
        f_index1=i-n_index1;
        break;
    }else if(temp1->data=='.')
    {
        n_index1=i;
    }
    temp1=temp1->link;
}

일단. 되는코드를 볼까요.

typedef struct _QUEUE
{
  char  data[10];
  int   idx;
  struct _QUEUE* pre;
  struct _QUEUE* next;
}NODE;
 
 
class CQUEUE
{
public:
    CQUEUE();
    ~CQUEUE(){};
 
    NODE* first;
    NODE* last;
 
    int m_cnt;
    void fn_push_front();
    void fn_push_back();
    void fn_pop_front();
    void fn_pop_back();
    void fn_view();
    void fn_delete(int idx);
};
 
 
CQUEUE::CQUEUE()
{
    m_cnt = 0;
    first = NULL;
    last = NULL;
}
 
void CQUEUE::fn_view()
{
    if(m_cnt == 0) return ;
    NODE* node = first;     //첫 노드부터 시작
    int i=0;
    for(i=0; i<m_cnt; i++)
    {
        //
//s        qDebug() << node->data;
        node = node->next;  //다음 노드
        if(node == NULL) return;
    }
}
 
void CQUEUE::fn_push_back()
{
    NODE* node = (NODE*) malloc(sizeof(NODE));
    if(m_cnt == 0)
    {
        node->pre = NULL;       //노드 앞이 NULL
        first = node;           //처음 노드 저장
    }
    else if(m_cnt > 0)
    {
        node->pre = last;       //노드 앞을 알려주기
        node->pre->next = node; //노드 앞의 뒤가 자신임을 알려주기
    }
    node->next = NULL;
    node->idx = m_cnt;
    sprintf(node->data, "node%d", m_cnt);
//    strcpy(node->data, "node");
 
    last = node;    //마지막 노드
    m_cnt++;
}
 
void CQUEUE::fn_pop_back()
{
    if(m_cnt == 0) return;
    free(last);
    last = NULL;
    m_cnt--;
}
 
void CQUEUE::fn_push_front()
{
 
}
 
void CQUEUE::fn_pop_front()
{
 
}
 
void CQUEUE::fn_delete(int idx)
{
    if(m_cnt == 0) return ;
    NODE* node = first;     //첫 노드부터 시작
    int i=0;
    for(i=0; i<m_cnt; i++)
    {
        if(i == idx)
        {
//s            qDebug() << "delete - " << node->data;
            //if first
            if(i == 0)
            {
                if(node->next)
                {
                    first = node->next;
                    node->next->pre = NULL;
                }
                else
                {
                    first = NULL;
                }
                free(node);
                node = NULL;
                m_cnt--;
                break;
            }
            //if last
            else if(i == m_cnt-1)
            {
                if(node->pre)
                {
                    node->pre->next = NULL;
                    last = node->pre;
                }
                free(node);
                node = NULL;
                m_cnt--;
                break;
            }
            //else all
            else
            {
                node->pre->next = node->next;
                if(node->next)
                {
                    node->next->pre = node->pre;
                }
                free(node);
                node = NULL;
                m_cnt--;
                break;
            }
 
        }
        //
        node = node->next;  //다음 노드
        if(node == NULL) return;
    }
}
 
 
//실행부
    CQUEUE queue;
    int i=0;
    for(i=0; i<100000; i++)
    {
        queue.fn_push_back();
    }
 
    for(i=0; i<100000; i++)
    {
        queue.fn_delete(i);
    }
    queue.fn_view();

보통은 STL같이 성능좋고 잘 정리된 라이브러리를 사용하지만.
익명님처럼 함수.로 리스트를 구현하거나
저처럼 함수 + 클래스로 링크드 리스트를 구현해보는것도 바람직하다보 봅니다.
일단 되는 소스로 break point 찍어가면서 어떻게 만들었는지 해보신후에
조금씩 따라서 재구현해보시면 이해도 되고 구현도 되실겁니다.

빌드가 되는 소스' 최대한 오류가 없는 소스'를 구해서
따라 만들어 보시는게 가장 좋습니다.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.