2014-08-27 1 views
0

두 개의 연결된 목록을 곱하려고 노력하고 있으며 기본 수학 곱셈 개념을 사용했습니다. 다른 연결된 목록 항목을 곱한 목록 항목을 가져 와서 결과를 다른 연결된 목록에 저장했습니다. 나는 성공적으로 그것을 달성하고 곱셈은 결과로 연결된리스트에 저장된다. 하지만 결과 링크 된 목록을 추가 할 때 문제가 있습니다. 모든 단계에서 합계가 올바르게 계산되지만 마지막 단계에서 가비지 값이 합계를 대체합니다. 내 논리가 잘못되면 저를 도와주세요.두 개의 연결된 목록의 곱셈에서 출력 오류

int multiply(struct node *first, struct node *second) 
{ 
    struct node *ans = NULL; 
    struct node *head = NULL; 
    struct node *rev_first = NULL; 
    struct node *rev_second = NULL; 
    int i, temp, mul, ten, carry=0, sum = 0; 
    rev_first = reverse(first); 
    rev_second = reverse(second); 
    while(rev_first != NULL) 
    { 
     ten = 1; 
     sum = 0; 
     head = rev_second; 
     while(head != NULL) 
     { 
      mul = (rev_first->data) * (head->data); 
      carry = mul/10; 
      temp = mul % 10; 
      sum = sum + (temp * ten); 
      ten = ten * 10; 
      head = head->next; 
     } 
     push(&ans, sum); 
     rev_first = rev_first->next; 
    } 
    sum = 0; 
    head = reverse(ans); 
    for(mul = 1;head != NULL;(mul *= 10)) 
    { 
     sum = sum + (mul * (head->data)); 
     head = head->next; 
    } 
    return sum; 
} 
+0

정수 오버플로가 발생합니까? 연결된 목록의 기간은 얼마나됩니까? –

+0

은 연결된 목록에 3 자리를 추가했습니다. int에서 long으로 sum을 변경했지만 여전히 동일한 문제가 발생했습니다 – Chetankur

답변

0

나는 코드에 다음과 같은 논리 오류를 참조하십시오

  1. 당신은 내부 while 루프가 시작되기 전에 0carry를 초기화하는 것을 잊었다.
  2. 곱셈을 사용하여 용어를 계산할 때 carry을 사용하는 것을 잊었습니다.
  3. while 루프가 끝난 후 carry을 사용하는 것을 잊었습니다.

다음은 수정 된 기능입니다.

int multiply(struct node *first, struct node *second) 
{ 
    struct node *ans = NULL; 
    struct node *head = NULL; 
    struct node *rev_first = NULL; 
    struct node *rev_second = NULL; 
    int i, temp, mul, ten, carry=0, sum = 0; 
    rev_first = reverse(first); 
    rev_second = reverse(second); 

    while(rev_first != NULL) 
    { 
     ten = 1; 
     carry = 0; // LINE ADDED 
     sum = 0; 
     head = rev_second; 
     while(head != NULL) 
     { 
      mul = (rev_first->data) * (head->data) + carry; // Added carry. 
      carry = mul/10; 
      temp = mul % 10; 
      sum = sum + (temp * ten); 
      ten = ten * 10; 
      head = head->next; 
     } 

     // ADDED THIS IF BLOCK. 
     // If there is any carry, use it. 
     if (carry > 0) 
     { 
      sum += carry * ten; 
     } 

     push(&ans, sum); 
     printList(ans); 
     rev_first = rev_first->next; 
    } 

    sum = 0; 
    head = reverse(ans); 
    for(mul = 1;head != NULL;(mul *= 10)) 
    { 
     sum = sum + (mul * (head->data)); 
     head = head->next; 
    } 
    return sum; 
} 

PS

다음 함수는 문제를 추적에 도움이되었다.

void printList(struct node* list) 
{ 
    for (; list != NULL; list = list->next) 
    { 
     printf("%d ", list->data); 
    } 
    printf("\n"); 
} 
+0

carry 개념을 추가 한 구현이 정확하고 받아 들일 수 있지만 여전히 문제는 해결되지 않았습니다. 모든 단계에서 합계를 인쇄하려면 최종 합계를 계산하기 위해 for 문에 print 문을 추가하십시오. 마지막 단계에서 쓰레기 값의 합계가 변경됩니다. @Chetankur, 나 아무런 문제가 보이지 않습니다. (mul = 1; head! = NULL; mul * = 10) {... printf ("sum : % d", sum);} – Chetankur

+0

http://ideone.com/zWfJav에서 작업 코드를 체크 아웃하십시오. –

+0

내 컴파일러에 문제가 발생했습니다. 나는 우분투를 준수하고 실행했다. 거기에서 완벽하게 잘 동작한다. 유효한 입력을 가져 주셔서 감사합니다. – Chetankur