list_sum 函数中的 destroy_list(pHead1_reversed) 和 destroy_list(pHead2_reversed) 函数似乎没有释放节点。我遇到了内存泄漏。我做错了什么?
int main(int argc, char* argv[])
{
//add up 189 + 11
Node* head1 = NULL;
Node* head2 = NULL;
Node* head_sum = NULL;
//create a list for the number 189
head_insert(&head1, 9);
head_insert(&head1, 8);
head_insert(&head1, 1);
//create a list for the number 11
head_insert(&head2, 1);
head_insert(&head2, 1);
head_sum = list_sum(head1, head2);
printf("The sum of ");
print_list(head1);
printf(" + ");
print_list(head2);
printf("\n");
printf(" = ");
print_list(head_sum);
printf("\n");
//clean up three lists
destroy_list(head1); head1 = NULL;
destroy_list(head2); head2 = NULL;
destroy_list(head_sum); head_sum = NULL;
return 0;
}
**********************************************************************
void head_insert(Node** hHead, int newItem)
{
Node* pNode = NULL;
pNode = (Node*)malloc(sizeof(Node));
if (pNode == NULL)
{
printf("malloc failed for node \n");
exit(1);
}
pNode->data = newItem;
pNode->next = *hHead;
*hHead = pNode;
}
void destroy_list(Node* hHead)
{
Node* current = hHead;
Node* next;
while (current != NULL) {
next = current->next;
free(current);
current = next;
}
}
Node* list_sum(Node* hHead1, Node* hHead2)
{
Node* pHead1_reversed=reverse(hHead1);
Node* pHead2_reversed=reverse(hHead2);
Node* result_reversed;
Node* resultHead = NULL;
int carry = 0;
while (pHead1_reversed != NULL || pHead2_reversed != NULL || carry != 0) {
int digit1 = (pHead1_reversed != NULL) ? pHead1_reversed->data : 0;
int digit2 = (pHead2_reversed != NULL) ? pHead2_reversed->data : 0;
int sum = digit1 + digit2 + carry;
carry = sum / 10;
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("malloc failed for result node \n");
exit(1);
}
newNode->data = sum % 10;
newNode->next = NULL;
if (resultHead == NULL) {
resultHead = newNode;
}
else {
Node* temp = resultHead;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
if (pHead1_reversed != NULL) pHead1_reversed = pHead1_reversed->next;
if (pHead2_reversed != NULL) pHead2_reversed = pHead2_reversed->next;
}
destroy_list(pHead1_reversed);
destroy_list(pHead2_reversed);
result_reversed = reverse(resultHead);
destroy_list(resultHead);
return result_reversed;
}
void print_list(Node* hHead)
{
Node* pHead = (Node*)hHead;
printf("*******\n");
while (pHead != NULL)
{
printf("%d\n", pHead->data);
pHead = pHead->next;
}
printf("*******\n");
}
Node* reverse(Node* hHead)
{
Node* resultHead = NULL;
Node* next;
while (hHead != NULL) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("malloc failed for result node \n");
exit(1);
}
newNode->data = hHead->data;
newNode->next = resultHead;
resultHead = newNode;
hHead = hHead->next;
}
return resultHead;
}
尝试将 pHead2_reversed 设置为 NULL,但没有成功。还尝试直接在反向函数中释放节点,而不是使用函数调用。上面是我的主驱动文件,下面是功能实现文件。
你在
list_sum
中泄漏了内存:
虽然你有:
destroy_list(pHead1_reversed);
destroy_list(pHead2_reversed);
...这些指针并不指向这些反向列表的头部,因为您在前面的循环中将它们向前移动了:
if (pHead1_reversed != NULL) pHead1_reversed = pHead1_reversed->next;
if (pHead2_reversed != NULL) pHead2_reversed = pHead2_reversed->next;
在循环之前,您必须保留对这些头的引用,然后释放从这些头节点开始的列表。