gpt4 book ai didi

c - 如何从链表的特定节点中删除和清除内存?

转载 作者:行者123 更新时间:2023-11-30 16:31:32 24 4
gpt4 key购买 nike

所以,我有一个包含 47000 个节点的链表。每个节点都有年月日。我想删除不适合[初始月份,最终月份]的节点。因此,例如,如果我选择月份的首字母为 3,最后的月份为 8,那么我想删除那些不适合年份和日期的月份。

LISTAPAISES *Filtra_month(LISTAPAISES * head, int month_init, int month_final) {
LISTAPAISES *aux=NULL, *elim=NULL, *aux2=NULL;
aux=head;
while(aux !=NULL){
if(aux->country.month>month_final || aux->country.month<month_init){
elim=aux;
aux=aux->next;
free(elim);
}
else{
if(aux2==NULL){
aux2=aux;
}
aux=aux->next;
}
}
return aux2;
}

这似乎没有得到我想要的点头,但它并没有清除它们,而是只是放入了随机数。有什么建议吗?提前致谢。

最佳答案

假设您有一个链表A->B->C。当您通过代码释放 B 节点(即前一个节点 A)时,它仍然指向旧的内存位置 B 而不是新节点C。随机数(如果不是段错误)只是过去读取 B 的垃圾内存。

通过使用两个指针来修复它,auxaheadaux 指针停留在 ahead 一个节点后面,如果 ahead 通过了失败的约束,则释放它,并分配 ahead 更改为 ahead->next,并相应更新 aux

LISTAPAISES* ahead = NULL;
aux = head;
// Special case if head passes the failing constain
if(head != NULL && (head->country.month>month_final || head->country.month<month_init)){
aux = aux->next;
free(head);
head = aux;
}
if(aux != NULL){
ahead = aux->next;
}
while(ahead != NULL){
if(ahead->country.month>month_final || ahead->country.month<month_init){
// Create a tmp pointer to hold the node after 'ahead'
LISTAPAISES* tmp = ahead->next;
free(ahead);
// Reassign the previous pointer to now point to `tmp`
aux->next = tmp;
// Update 'ahead' to be 'tmp' for the next iteration
ahead = tmp;
}
else{
ahead = ahead->next;
aux = aux->next;
}
}

return head;

关于c - 如何从链表的特定节点中删除和清除内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50520616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com