fgets나 strtok을 쓴다고 하면

지금 구현한 곱셈 함수 외 기타등등을 갈아 엎어야 하더라고요.


그리고 지금 형식으로는 도저히 답이 안나온다고 판단해서, 결국 책에 있는 예제를-_-참고하면서 만들었고요.

결과 다음과 같은 코드를 짜고, 많은 항이 있는 다항식 계산도 됩니다.




#include <stdio.h>
#include <stdlib.h>

typedef struct polynode
{
    int coefficient;
    int exponent;
    struct polynode *next;
}polynode;




polynode *make_node(int coefficient, int exponent)
{
        polynode *node;
        node=(polynode *)malloc(sizeof(polynode));
        if (node)
        {
                node->coefficient=coefficient;
                node->exponent=exponent;
                node->next=NULL;
        }

        return node;
}


void insert_node(polynode *head, polynode *add_node)
{
    polynode *now_node=head;
        if (head && add_node)
        {                
                while(now_node->next!=NULL)
                {
            if (now_node->next->exponent < add_node->exponent)
                        {
                                add_node->next=now_node->next;
                                now_node->next=add_node;
                        }
                        now_node=now_node->next;
                }

                if (now_node->next==NULL)
                {
                        add_node->next=now_node->next;
                        now_node->next=add_node;                                                
                }        
        }
}




int file_input(char *fileName, polynode ***pNode)
{
        FILE  *input_d;
    polynode  **head=NULL;
    int   coefficient;
    int   exponent;
        int   flag;
        int   headnum;
  
        input_d=fopen(fileName, "rt");

        if (input_d==NULL)
        {
                printf("파일을 읽을 수 없습니다!!n");
                exit(1);
        }

        flag=0;
        headnum=0;
        while(fscanf(input_d,"%d%d",&coefficient,&exponent)!=EOF)
        {
                if (flag!=1)
                {
                        headnum++;
                        head=(polynode **)realloc(head, sizeof(polynode *)*headnum);
            head[headnum-1]=make_node(0,0);        
                        flag=1;
                }
                insert_node(head[headnum-1], make_node(coefficient,exponent));
                if (exponent==0) flag=0;
        }

        *pNode=head;

        fclose(input_d);

        return headnum;
}







void add_PostNode(polynode *head, polynode *add_node)
{
    polynode *now_node=head;
    polynode *temp;
        if (head && add_node)
        {                
                while(now_node->next!=NULL)
                {
                        if (now_node->next->exponent==add_node->exponent)
                        {
                                now_node->next->coefficient+=add_node->coefficient;
                                free(add_node);
                                if (now_node->next->coefficient==0)
                                {
                                        temp=now_node->next;
                                        now_node->next=now_node->next->next;
                                        if (temp) free(temp);
                                }
                                return;
                        }else if (now_node->next->exponent < add_node->exponent)
                        {
                                add_node->next=now_node->next;
                                now_node->next=add_node;
                        }
                        now_node=now_node->next;
                }

                if (now_node->next==NULL)
                {
                        add_node->next=now_node->next;
                        now_node->next=add_node;                                                
                }        
        }
}




void MULTIPLICATION_POLY(polynode *head1, polynode *head2, polynode *sumhead)
{
    polynode  *node1, *node2;
    int   coefficient;
    int   exponent;

        if (head1 && head2 && sumhead)
        {
                for(node1=head1->next; node1!=NULL; node1=node1->next)
                {
                        for(node2=head2->next; node2!=NULL; node2=node2->next)
                        {
                                coefficient=node1->coefficient*node2->coefficient;
                                exponent = (node1->exponent) ? node1->exponent : node2->exponent;
                                if (node1->exponent!=0 && node2->exponent!=0)
                                {
                                        exponent = node1->exponent + node2->exponent;
                                }else{
                                        exponent = (node1->exponent!=0) ? node1->exponent : node2->exponent;
                                }
                                add_PostNode(sumhead, make_node(coefficient,exponent));
                        }
                }
        }
}



int fileOUTPUT(char *fileName, polynode *head)
{
        FILE *out;
        polynode *node;
        if (head)
        {
                out=fopen(fileName, "wt");
                
                if (out==NULL)
                {
                        printf("파일이 쓸 수 없음!n");
                        return 0;
                }
                
                for(node=head->next; node!=NULL; node=node->next)
                {
                        fprintf(out,"%d %d ",node->coefficient,node->exponent);
                }
                        
                fclose(out);
                return 1;
        }

        return 0;
}






void delete_node(polynode *head, polynode *del_node)
{
    polynode *now_node;
    polynode *temp;
        if (head && del_node)
        {                
                now_node=head;
                while(now_node->next!=NULL)
                {
             if (now_node->next->coefficient==del_node->coefficient &&
                                 now_node->next->exponent==del_node->exponent)
                         {
                 temp=now_node->next;
                 now_node->next=now_node->next->next;
                                 if (temp) free(temp);
                                 return;
                         }
                         now_node=now_node->next;
                }
        }
}

void delete_all_node(polynode *head)
{
    polynode *now_node;
    polynode *temp;
        if (head)
        {                
                now_node=head;
                while(now_node!=NULL)
                {
            temp=now_node;
                        now_node=now_node->next;
            if (temp) free(temp);
                }
        }
}



int main()
{
        polynode *node=NULL;
        polynode **heads;
        polynode *sumhead;
        int  nHeadnum;

        char *finput = "hw1.inp", *foutput = "hw1.out";
        

        nHeadnum=file_input(finput, &heads);
    sumhead=make_node(0,0);
        
    MULTIPLICATION_POLY(heads[0], heads[1], sumhead);
        
        fileOUTPUT(foutput, sumhead);

        delete_all_node(heads[0]);
        delete_all_node(heads[1]);
        delete_all_node(sumhead);
        if (heads)
        {
                free(heads);
                heads=NULL;
                nHeadnum=0;
        }
        
        return 0;
}



그런데 문제가 있습니다-_-

집 컴퓨터로는 잘 되는데요.

과제를 서버에 제출하면 (유닉스던가.. 그럴껍니다;) 타임오바가 되버립니다;

컴파일은 되는데 데이터를 받을때 그렇게 되는거 같습니다.


저가 알기로는 서버에서 주는 다항식의 항의 개수가 1000개쯤-_-;; 되는거로 알고요.

20초를 넘어가면 타임오바가 되게 설정을 해놨더라고요..

했긴했는데 타임오바라니 이게 뭡니까-_-;;;; 타임오바가 나지 않게 하려면 뭘 해야할까요;?

이런 경우는 처음이라서 당황스럽네요..


실재로 항을 50개쯤 만들어서 해보니까 뻗어버리네요; 이거 대체 왜이럴까요

적은 다항식은 잘됐는데..