我正在尝试进行一项练习,在该练习中,必须确保链接列表中的所有元素都是有序的(基本上,列表应按升序排列),如果任何元素大于下一个元素,则将其删除并从中删除记忆。这是我目前的尝试:
struct node *remove_disorder(struct node *head) {
struct node *curr = head;
struct node *prev = head;
if (curr == NULL) {
return NULL;
}
if (curr->next == NULL) {
return head;
}
struct node *temp = NULL;
while (curr->next != NULL) {
while (curr->data > curr->next->data) {
if (curr == head) {
prev = curr->next;
free(curr);
curr = prev;
curr->next = prev->next;
head = prev;
} else {
prev->next = curr->next;
temp = curr;
curr = prev;
curr->next = prev->next;
free(temp);
}
}
prev = curr;
curr = curr->next;
}
return head;
}
编译器告诉我,即使我在释放新值后分配curr,我也正在访问while (curr->data > curr->next->data)
中已释放的内存。有人可以指出我做错了吗?
您的代码有一些多余的分配。分配node2 = node1
后,无需分配node2->next = node1->next
。