Проблема в том, что вы забыли malloc
новые элементы для нового списка (он же start
/ temp3
) внутри циклов.
Здесь:
temp3 = (struct ListNode*)malloc(sizeof(struct ListNode));
Вы выделяете один struct ListNode
, но внутри, например, этот цикл:
while (temp1 != NULL && temp2 != NULL)
{
v1 = temp1->val;
v2 = temp2->val;
val = v1 + v2;
if (val > 9)
{
(temp3->val) = (val - 10); //error here
temp1 = temp1->next;
(temp1->val) = ((temp1->val) + 1);
}
else
(temp3->val) = val;
if (start == NULL)
start = temp3;
temp3 = temp3->next; // temp3 will become NULL in first iteration
temp1 = temp1->next;
temp2 = temp2->next;
}
temp3
станет NULL в первой итерации, поэтому в следующий раз вы делаете:
(temp3->val) = (val - 10);
вы разыменовываете нулевой указатель и получаете сбой.
Вам потребуется malloc
новый элемент в каждом цикле.Поэтому вместо того, чтобы просто делать temp3 = temp3->next;
, вам нужно что-то вроде этого в цикле:
temp3->next = malloc(sizeof(struct ListNode)); // No need for cast
temp3 = temp3->next;
if (!temp3->) exit(0);
temp3->val = 0;
temp3->next = NULL;
(это относится ко всем вашим циклам)
Также обратите внимание, что start
равно неинициализированный .Не забудьте инициализировать его как NULL
Также посмотрите на этот код:
(temp3->val) = (val - 10); //error here
temp1 = temp1->next;
(temp1->val) = ((temp1->val) + 1);
Я думаю, вам нужно взглянуть и на следующие две строки.
(temp3->val) = (val - 10);
temp1 = temp1->next; // Here you change temp1
(temp1->val) = ((temp1->val) + 1); // Here you dereference temp1
Теперь, если temp1
становится НЕДЕЙСТВИТЕЛЬНЫМ, когда это изменяется, разыменование вызовет другой сбой.
Вы должны сделать:
(temp3->val) = (val - 10);
temp1 = temp1->next;
if (temp1)
{
(temp1->val) = ((temp1->val) + 1);
}
Кроме того, также сделайте это изменение:
temp3 = (struct ListNode*)malloc(sizeof(struct ListNode));
if (!temp3) // Put the check here
exit(0);
temp3->val = 0;
temp3->next = NULL;
// if (!temp3) Remove this code
// exit(0);
Кстати: вам не нужно разыгрывать malloc
Просто выполните:
temp3 = malloc(sizeof(struct ListNode));