循环中有一个很大的错误。
只有一个元素被“上移”,并且在设置为 null 后上移。
所以,这个列表 -> wlist_ptr[i] = NULL; 列表->wlist_ptr[i-1] = 列表->wlist_ptr[i];
需要对此进行更改以防止将 NULL 向上移动:
list->wlist_ptr[i-1] = list->wlist_ptr[i];
list -> wlist_ptr[i] = NULL;
但是,需要一个循环来遍历列表的其余部分以将它们也向上移动。 memmove
是你的朋友。还要记住,完成后,您不想i
为下一次迭代增加,因为列表中的下一个元素现在将位于原始i
位置。
也许这可以完成这项工作:
struct wifi_info_t *wifilist_remove(struct wifilist_t * list, int user_address)
{
int i;
int count;
struct wifi_info_t *ptr;
ptr = NULL;
count = wifilist_number_entries(list);
// TODO: take out the ( ptr == NULL ) logic if more than one match needs to be
// removed.
for(i=0; ( i < count ) && ( ptr == NULL ); i++)
{
if(list -> wlist_ptr[i] -> eth_address == user_address)
{
ptr = list -> wlist_ptr[i];
if ( i < ( count - 1 ) )
memmove(&(wlist_ptr[i]), &(wlist_ptr[i + 1]), (count - (i + 1)) * sizeof(wlist_ptr[0]));
// TODO: decrement the length of the list returned by
// wifilist_number_entries(list)
}
}
if(ptr != NULL)
{
list->wlist_entries--;
}
return ptr;
}
请注意,我只是在这里输入了这个,所以它可能有语法错误等。