首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言陣列「刪除」指定值的正確姿勢:資料搬移而非賦值為 0

     編輯:程式設計綜合問答

誤區

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)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved