簡體   English   中英

刪除列表中的最后一個元素

[英]Remove last element in list

我目前在結構中使用的列表如下所示:

此功能可從列表中刪除元素。 我從for循環開始,遍歷整個列表。 如果i小於條目數,則輸入if語句。 然后將其舊位置變為保留ptr。 將舊的on =設置為NULL,然后移動列表,以便下面的元素占據其位置。

當我調用此函數時,以下是示例列表:

100125150

當我這樣做並想從列表中刪除150時,它會通過但會失去對列表-> wlist_ptr [i]-> eth_address中的內存的訪問。 然后我遇到了故障。 松動軌道有什么辦法嗎?

一些例子:

struct wifi_info_t *wifilist_remove(struct wifilist_t * list, int user_address)
{
    int i;
    struct wifi_info_t *ptr;
    ptr = NULL;
    for(i=0; i < wifilist_number_entries(list); i++)
    {
        if(list -> wlist_ptr[i] -> eth_address == user_address)
        {
            ptr = list -> wlist_ptr[i];
            if(i != (wifilist_number_entries(list) -1))
            {
                //replace it with last element
                list -> wlist_ptr[i] = list -> wlist_ptr[wifilist_number_entries(list)-1];
                list -> wlist_ptr[wifilist_number_entries(list)-1] = ptr;
            }
            //you can use free and realloc there if you want
            list->wlist_entries--;
        }
    }
    //why? don't do that
    return ptr;
}

循環中有一個大錯誤。

只有一個元素被“向上移動”,並且在將其設置為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;
}

請注意,我只是在這里輸入了此內容,因此可能存在語法錯誤或類似錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM