ループに大きな間違いがあります。
「上に移動」される要素は 1 つだけで、null に設定された後に上に移動されます。
したがって、このリスト -> wlist_ptr[i] = NULL; list->wlist_ptr[i-1] = list->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;
}
ここにこれを入力しただけなので、構文エラーなどがある可能性があることに注意してください。