2012-07-25 34 views
2

我想寫的remove for Java的ArrayList等值C.c從動態數組

刪除元素這裏是我的代碼。它假定索引是列表中的有效索引。

void arrayListRemove(ArrayList* list, int index){ 
    int i; 
    if (arrayListSize(list)==1){ 
    list->size = 0; 
    free(list->data); 
    list->data = NULL; 
    } else { 
    for(i=index;i<arrayListSize(list)-1;i++){ 
     list->data[i] = list->data[i+1]; 
    } 
    list->data = realloc(list->data, (arrayListSize(list) - 1) * sizeof(void*)); 
    if (list->data != NULL){ 
     --list->size; 
    } else { 
     exit(1); 
    } 
    } 
} 

這是正確的嗎?

代碼能否在沒有arrayListSize(list) == 1檢查的情況下工作?即realloc(list->data, 0)是否釋放arrayList?我在網上看到有關realloc(ptr, 0)會發生什麼衝突。

+2

「這是否正確」涵蓋了很多的理由。你有沒有什麼特別的問題,比如「爲什麼這個輸入Y在X行上崩潰」,或者「這可以做得更快」等等。 – 2012-07-25 19:01:35

+0

代碼是否在沒有arrayListSize(list)== 1檢查的情況下工作?即。 realloc(list-> data,0)釋放arrayList?我在網上看到有關realloc(0)會做什麼的衝突。 – 2012-07-25 19:11:34

+0

注意:你可以通過使用memmove()來避免顯式循環。你可以用'sizeof list-> data [0]'替換'sizeof(void *)'。如果列表是無序的,則用數組中最後一個元素替換已刪除的元素會更便宜。最後:如果指數超出規模,您仍然會減小尺寸,這看起來不對。 – wildplasser 2012-07-25 19:27:35

回答

3

我會離開arrayListSize(list) == 1的情況。不依賴於realloc(ptr, 0)的行爲似乎是謹慎的,它通常使用明確的free使代碼更清晰。

一些更多的注意事項:

  • 當使用realloc,一定要在一個tmp變量來獲取返回值。如果realloc失敗,則它可以返回NULL並保持原始指針不變。通過執行ptr = realloc(ptr);,當realloc失敗時,您可能會導致內存泄漏,因爲您現在已經丟失了原始指針。從列表中刪除它們時

    tmp = realloc(ptr, newSize); 
    if (tmp != NULL) 
        ptr = tmp; 
    else handleError(); 
    
  • 是否有必要free列表的元素:改用這個成語?您的data數組由指針組成,您是否因未移除的元素調用free而泄漏內存?自然,這在java實現中並不是必需的。如果您的列表包含唯一對被包含對象的引用,那麼在刪除它們時需要free將函數中的指針返回,並留給調用者處理內存。

  • 有通常不需要使用realloc縮水列表,除非你是一個平臺,真的內存的限制,即使這樣,它可能是不必要的縮小分配塊刪除列表元素。傾向於通過多個單元增加/縮小分配的塊。

  • 這的確是一個挑剔,但由於這是一個API方法,以及您使用的數據結構的size成員跟蹤表的長度,你還不如用size貫穿始終,而不是依靠其他API方法arrayListSize

+0

如果您正在模擬Java的數組列表功能,那麼還要添加註釋,它們不會縮小數組,只會減少包含的元素的數量 – ardent 2012-07-25 19:02:07