2014-08-27 6 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, но все еще ту же самую проблему. – Chetankur

ответ

0

Я вижу следующие логические ошибки в коде:

  1. Вы забыли инициализировать carry к 0 перед началом внутренней while цикла.
  2. Вы забыли использовать carry при вычислении терминов с использованием умножения.
  3. Вы забыли использовать carry после окончания внутреннего цикла while.

Вот исправленная функция.

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

Ваша реализация добавления концепции переноса была правильной, и я ее принимаю, но проблема остается нерешенной. Пожалуйста, добавьте инструкцию печати в цикл for для вычисления окончательной суммы, чтобы распечатать сумму на каждом шаге. На последнем шаге вы увидите изменения сумм в размере мусора. для (mul = 1; head! = NULL; mul * = 10) {... printf ("sum:% d", sum);} – Chetankur

+0

@Chetankur, я не вижу никаких проблем. Оформить рабочий код на сайте http://ideone.com/zWfJav. –

+0

возникла проблема с моим компилятором. Я выполнил и выполнил на Ubuntu, и он отлично работает. Благодарим вас за достоверные данные. – Chetankur

Смежные вопросы