我必须从链接列表中删除所有小于或等于" media"的元素。我已经编写了这个函数,但它并没有对某些输入起作用。
代码:
typedef struct lista {
int dato;
struct lista *next;
}
node;
......
.....
.....
void filtra_elementi(node ** head, int media)
{
node *prec, *corr;
while(((*head)->dato <= media) &&((*head!=NULL)))
{
corr=(*head)->next;
free(*head);
*head=corr;
}
prec=*head; corr=(*head)->next;
while(corr!=NULL)
{
if(corr->dato<=media)
{
prec->next=corr->next;
//free(corr);
corr=prec->next;
}
else prec=corr; corr=corr->next;
}
}
这是功能。 如果列表是,它不起作用 0 10 1 11 3 13 4 14 5 15 有人能解释一下为什么吗?感谢。
答案 0 :(得分:1)
corr=prec->next;
}
else prec=corr; corr=corr->next;//corr=corr->next is not in else part and will always be executed.
}
你想要的是
corr=prec->next;
}
else
{prec=corr;
corr=corr->next;
}
}
你的while条件也是错误的。你应该改变check的顺序。想想如果(*head)
是null
会发生什么,那么访问(*head)->dato)
会导致运行时错误。如果你用这个
while(((*head!=NULL)) && ((*head)->dato <= media))
如果(*head)
null
(*head)->dato
将无法访问。
答案 1 :(得分:0)
这是函数的另一个版本,有点简单,只有一个循环
void filtra_elementi(node **head, int media)
{
node *next;
while(*head != NULL) {
next = (*head)->next;
if((*head)->dato <= media) {
free(*head);
*head = next;
} else {
head = &((*head)->next);
}
}
}