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

C 語言數組操作全家桶:查找、插入、刪除、修改完整實現

     編輯:更多程式設計知識

數組是 C 語言最基礎的數據結構,掌握其增刪改查操作是進階算法與數據結構的敲門磚。本文提供一個完整、可編譯運行的控制台程序,涵蓋隨機初始化、遍歷輸出、指定位置插入、值查找(支持重複值)、位置修改、值刪除(刪除所有匹配項)六大核心操作,並附帶詳細註釋與邊界檢查。

程序架構設計

  • 全局狀態:size 記錄當前有效長度,flag 輔助查找函數實現「查找下一個」語義。
  • 動態內存:malloc(2 * size * sizeof(int)) 預留 2 倍空間,避免插入時頻繁 realloc。
  • 模塊化函數:每個操作獨立函數,main 僅負責交互流程。

核心函數詳解

1. 輸出遍歷 output()

void output(int *arry) {
    for (int i = 0; i < size; i++) {
        printf("arry[%d]=%d\t", i, arry[i]);
        if ((i + 1) % 5 == 0) printf("\n");  // 每行 5 個
    }
    printf("\n");
}

2. 隨機初始化 getarry()

void getarry(int *arry) {
    srand(time(NULL));
    for (int i = 0; i < size; i++) arry[i] = rand() % 100;
}

3. 指定位置插入 add()

邏輯:位置合法性檢查 → 中間插入需後移元素 → 尾部插入直接賦值 → size++。

void add(int *arry, int pos, int num) {
    if (pos < 0 || pos > size) { printf("只能在 0-%d 位置插入\n", size); return; }
    if (pos < size) {
        for (int i = size; i > pos; i--) arry[i] = arry[i - 1]; // 後移
    }
    arry[pos] = num;
    size++;
}

4. 值查找 search()(支持重複值迭代)

設計巧思:靜態變量 pos 記錄上次位置,flag 控制是否從下一位開始,實現「查找下一個」語義。

int search(int *arry, int num) {
    static int pos = 0;
    if (flag) pos++;
    for (; pos < size; pos++) {
        if (arry[pos] == num) { flag = 0; return pos; }
    }
    return -1;
}

5. 位置修改 mod()

void mod(int *arry, int pos, int num) {
    if (pos >= 0 && pos < size) arry[pos] = num;
    else printf("輸入位置錯誤\n");
}

6. 值刪除 del()(刪除所有匹配)

算法:循環調用 search 找到位置 → 前移覆蓋 → size-- → 重置 flag=1 繼續找下一個。

int del(int *arry, int num) {
    int count = 0, pos = 0;
    pos = search(arry, num);
    while (pos != -1) {
        for (int i = pos; i < size - 1; i++) arry[i] = arry[i + 1];
        size--; count++; flag = 1; // 設置 flag 讓 search 從下一位繼續
        pos = search(arry, num);
    }
    return count;
}

主流程交互演示

int main() {
    int *arry = NULL;
    printf("輸入要產生多少個隨機數:"); scanf("%d", &size);
    arry = malloc(2 * size * sizeof(int));
    getarry(arry); output(arry);

    int pos, num;
    printf("輸入要添加的位置(0-%d):", size); scanf("%d", &pos);
    printf("輸入要添加的數字:"); scanf("%d", &num);
    add(arry, pos, num); output(arry);

    printf("輸入要查找的數字:"); scanf("%d", &num);
    pos = search(arry, num);
    while (pos != -1) { flag = 1; printf("arry[%d]=%d\n", pos, num); pos = search(arry, num); }

    printf("輸入要修改的位置:"); scanf("%d", &pos);
    printf("輸入要修改為數字:"); scanf("%d", &num);
    mod(arry, pos, num); output(arry);

    printf("輸入要刪除的數字:"); scanf("%d", &num);
    del(arry, num); output(arry);

    free(arry); arry = NULL;
    return 0;
}

編譯運行與擴展建議

  • 編譯:gcc array_ops.c -o array_ops && ./array_ops
  • 缺陷與改進:
    • 全局變量耦合度高 → 封裝為 struct ArrayList { int *data; int size; int capacity; }。
    • 查找 flag 機制非線程安全 → 改為返回迭代器或索引數組。
    • 擴容策略固定 → 實現 ensureCapacity() 倍增擴容。
    • 泛型支持 → 用 void* + 比較函數指針實現類型無關。

這個小程序雖簡單,但完整演示了 C 語言手動管理內存、指針算術、函數模塊化的核心技藝,是通往動態數組、鏈表、哈希表的必經之路。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved