#include <stdio.h>

#include <stdlib.h>


/* 

   double linked list 

   term adder

*/


typedef struct ListNode {

   int coef;

   int expon;

   struct ListNode *Llink;

   struct ListNode *Rlink;

}ListNode;


//typedef struct ListHeader {

//        int length;

//        ListNode *head;

//        ListNode *tail;

//}ListHeader;

//오류 처리 함수 

void error(char *message){

   fprintf(stderr, "%s\n", message);

   exit(1);

}


//초기화 함수 

void init(ListNode *phead){

   phead -> Llink = phead;

   phead -> Rlink = phead;

}




//plist는 연결리스트의 헤더를 가리키는 포인터, coef는 계수, expon은 지수 

void insert_node(ListNode *phead, int coef, int expon){

   ListNode *temp;

   temp = (ListNode *)malloc(sizeof(ListNode));

   if(temp == NULL) error("메모리 할당 에러");

   temp->coef = coef;

   temp->expon = expon;

   

   temp->Llink = phead;

   temp->Rlink = phead -> Rlink;

   phead->Rlink->Llink = temp;

   phead->Rlink = temp;


   //plist->length++;

}


//list3 = list1+ list2

void poly_add(ListNode *plist1, ListNode *plist2, ListNode *plist3){

   ListNode *a = plist1->Llink;

   ListNode *b = plist2->Llink;

   int sum;


   while(a != plist1 && b != plist2){

      if(a->expon == b->expon){

         sum = a->coef + b->coef;

         if(sum != 0)

            insert_node(plist3, sum, a->expon);

         a = a -> Llink;

         b = b -> Llink;

      }

      else if(a->expon > b->expon){

         insert_node(plist3, a->coef, a->expon);

         a = a->Llink;

      }

      else{

         insert_node(plist3, b->coef, b->expon);

         b = b->Llink; 

      } 

   }

   //a나 b중의 하나가 먼저 끝나게 되면 남아있는 항들을 모두 결과 다항식으로 복사 

   if(a != plist1){

      for( ; a != plist1 ; a = a->Llink){

         insert_node(plist3, a->coef, a->expon);

      }

   }

   if(b != plist2){

      for( ; b != plist2 ; b = b->Llink){

         insert_node(plist3, b->coef, b->expon);

      }

   }

}

//다항식 출력 함수 

void poly_print(ListNode *plist){

   ListNode *p;

   for(p = plist->Llink; p != plist; p = p->Llink){

      printf("%d %d\n", p->coef, p->expon);

   }

//이중연결리스트의 응용테스트 프로그램

int main() {


   ListNode list1, list2, list3;


   //연결리스트의 초기화

   init(&list1);

   init(&list2);

   init(&list3);


   //다항식 1을 생성

   insert_node(&list1, 3, 12); 

   insert_node(&list1, 2, 8); 

   insert_node(&list1, 1, 0); 


   //다항식 2를 생성

   insert_node(&list2, 8, 12); 

   insert_node(&list2, -3, 10); 

   insert_node(&list2, 10, 6); 


   //다항식3 = 다항식1 + 다항식2

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

   poly_print(&list3);


   //system("pause");

   return 0;

'이전것 > 개발' 카테고리의 다른 글

module  (0) 2016.05.02
open | read  (0) 2016.04.11
Wireshark_Intro_6.0  (0) 2015.03.24
AvlNode  (0) 2014.12.04
체이닝의 구현  (0) 2014.11.20
블로그 이미지

잉비니

,