誤區
if (b == a[i]) a[i] = 0; // 只是把值改成 0,陣列長度不變,記憶體未釋放
正確做法:資料搬移 (左移覆蓋)
int len = 5;
int a[5] = {1,2,3,4,5};
int b = 3; // 要刪除的值
int writeIdx = 0;
for (int readIdx = 0; readIdx < len; readIdx++) {
if (a[readIdx] != b) {
a[writeIdx++] = a[readIdx];
}
}
len = writeIdx; // 新的有效長度
// 顯示結果
for (int i = 0; i < len; i++) printf("%d ", a[i]); // 1 2 4 5
封裝成函式
int array_remove(int *arr, int len, int value) {
int w = 0;
for (int r = 0; r < len; r++)
if (arr[r] != value) arr[w++] = arr[r];
return w; // 回傳新長度
}
效能與替代結構
- 陣列刪除 O(N) 需搬移,頻繁刪除建議用 鏈結串列 (O(1) 刪除) 或 動態陣列 (C++
vector::erase)。
- 若順序不重要,可用「與最後一元素交換再縮減長度」 O(1)。