Ich habe zwei verkettete Listen, die zwei nicht negative Zahlen darstellen. Die Ziffern werden in umgekehrter Reihenfolge gespeichert und jeder ihrer Knoten enthält eine einzelne Ziffer. Ich muss einen Code schreiben, der die beiden Zahlen addiert und als verkettete Liste zurückgibt (in umgekehrter Reihenfolge).Warum führt mein Code zu einem Laufzeitfehler?
Ich habe den folgenden Code geschrieben. Es funktioniert gut, solange die letzte Ziffer nicht 9 ist. Es sieht so aus, als ob es ein Speicherzuweisungsproblem ist, aber ich kann nicht herausfinden, was.
Kann jemand vorschlagen, was falsch ist und wie man es repariert?
/**
* 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;
}
};
Das richtige Tool, um dies herauszufinden, ist Ihr Debugger. Zum allerletzten konnte man feststellen, welche Zeile den Fehler verursacht – UnholySheep
Die Adresse einer lokalen Variablen zu nehmen ist ein Rezept für ein Desaster (& last). Es wird ungültig außerhalb des Gültigkeitsbereichs, in dem es erklärt wird – crashmstr
Glauben Sie wirklich, dass es eine gute Idee ist, einen Zeiger zu einer lokalen Variable hinzuzufügen, die weggeht, wenn die Unterroutine zum Ende einer verknüpften Liste hinausgeht? – infixed