struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode *temp1, *temp2, *temp3, *start;
temp3 = (struct ListNode*)malloc(sizeof(struct ListNode));
temp3->val = 0;
temp3->next = NULL;
if (!temp3)
exit(0);
temp1 = l1;
temp2 = l2;
int val, v1, v2, v3;
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;
temp1 = temp1->next;
temp2 = temp2->next;
}
while (temp1 != NULL)
{
(temp3->val) = (temp1->val);
if (start == NULL)
start = temp3;
temp3 = temp3->next;
temp1 = temp1->next;
}
while (temp2 != NULL)
{
(temp3->val) = (temp2->val);
if (start == NULL)
start = temp3;
temp3 = temp3->next;
temp2 = temp2->next;
}
return start;
}
此代码行有错误(行:31 (temp3->val)=(val-10);
)
在为temp3
(temp3->val=0; temp3->next=NULL;
)分配内存之后,我尝试添加这些代码行,但是没有用。
答案 0 :(得分:1)
问题是您忘记在循环内为新列表(又名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);
您取消引用NULL指针并崩溃。
您需要在每个循环中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
在更改时变为NULL,则取消引用将导致另一次崩溃。
您应该这样做:
(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));