2016-12-06 4 views
-1

Мне даны два связанных списка, представляющих два неотрицательных числа. Цифры хранятся в обратном порядке, и каждый из их узлов содержит одну цифру. Я должен написать код, который добавляет два числа и возвращает его как связанный список (в обратном порядке также).Почему мой код приводит к ошибке выполнения?

Я написал следующий код. Он отлично работает, пока последняя цифра не равна 9. Похоже, что это проблема распределения памяти, но я не могу понять, что.

Может ли кто-нибудь предположить, что не так, и как его исправить?

/** 
* Definition for singly-linked list. 
* struct ListNode { 
*  int val; 
*  ListNode *next; 
*  ListNode(int x) : val(x), next(NULL) {} 
* }; 
*/ 

void adder(int &value, bool &carry) { 
    if(carry) value++; 
    if (value > 9) { 
     value = value%10; 
     carry = true; 
    }else carry = false; 
} 

class Solution { 
public: 
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { 
     ListNode* prev = NULL; 
     bool carry = false; 
     ListNode* curr1 = l1; 
     ListNode* curr2 = l2; 
     ListNode* worker = NULL; 

     while(curr1 != NULL && curr2 != NULL){ 
      curr1 = curr1->next; 
      curr2 = curr2->next; 
     } 

     if(curr1 != NULL) worker = l1; 
     else worker = l2; 

     ListNode* result = worker; 
     curr1 = l1; 
     curr2 = l2; 

     while(curr1 != NULL && curr2 != NULL) { 
      int value = curr1->val + curr2->val ; 
      adder(value, carry); 
      worker->val = value; 
      //cout<<curr1->val<<endl; 
      curr1 = curr1->next; 
      curr2 = curr2->next; 
      prev = worker ; 
      worker = worker->next; 
     } 

     while(worker != NULL && carry) { 
      int value = worker->val; 
      adder(value, carry); 
      worker->val = value; 
      prev = worker; 
      worker = worker->next; 
     } 

     ListNode last(1); 

     //the following line results in runtime error 
     if(carry) { 
      prev->next = &last; 
     } 

     return result; 

    } 
}; 
+7

Правильный инструмент, используемый для выяснения этого, является вашим отладчиком. В крайнем случае вы могли бы определить, какая строка вызывает ошибку. – UnholySheep

+1

Взятие адреса локальной переменной - это рецепт катастрофы (& last). Он будет недопустим за пределами области, в которой он объявлен. – crashmstr

+3

Вы действительно думаете, что это хорошая идея добавить указатель на локальную переменную, которая уходит, когда подпрограмма выходит из конца связанного списка? – infixed

ответ

0

У вас есть как минимум две очевидные ошибки. Первый, нет никакой гарантии, насколько я могу видеть, по крайней мере, в prev

prev->next = &last; 

не является NULL. Это ошибка в логике вашего алгоритма. Второй, вы добавляете в связанный список локальный объект last. Вместо этого вы должны выделить новый ListNode, используя new, например.

assert(prev);  // must not be NULL 
prev->next = new ListNode(1); 
Смежные вопросы