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

C語言定長字串陣列管理:新增、刪除、查詢完整實作

     編輯:關於C

設計目標

  • 固定長度字串(最長 9 字元 + \0,佔 10 bytes)。
  • 單一大陣列存儲所有字串,配合旗標陣列標記有效槽位。
  • 支援新增(尋找首個空槽)、刪除(清旗標)、查詢(遍歷列印)。
  • 刪除後空間可重用,簡單模擬記憶體池。

資料結構

#define CSTRSPACE 10000              // 總字元空間
#define NFLAGLEN  (CSTRSPACE / 10)   // 最大字串數 = 1000

char cStr[CSTRSPACE] = {0};          // 字串儲存區
int  nFlag[NFLAGLEN] = {0};          // 0=空閒, 1=有效

核心功能實作

1. 新增字串


void addString(char *pcStr, int *pnFlag) {
    printf("請輸入字串(最長9字元):\n");
    for (int i = 0; i < NFLAGLEN; i++) {
        if (pnFlag[i] == 0) {                 // 找到空槽
            scanf("%9s", pcStr + i * 10);     // %9s 防溢位
            while (getchar() != '\n');        // 清理輸入緩衝區
            pnFlag[i] = 1;
            printf("新增成功!索引:%d\n\n", i);
            return;
        }
    }
    printf("儲存空間已滿!\n\n");
}

2. 刪除字串


void delString(char *pcStr, int *pnFlag) {
    searchString(pcStr, pnFlag);  // 先顯示現有內容
    printf("請輸入要刪除的索引:\n");
    int idx;
    if (scanf("%d", &idx) != 1) return;
    while (getchar() != '\n');

    if (idx >= 0 && idx < NFLAGLEN && pnFlag[idx] == 1) {
        pnFlag[idx] = 0;              // 僅清旗標,資料保留直到被覆寫
        printf("刪除成功!\n\n");
    } else {
        printf("索引無效或該槽位已空!\n\n");
    }
}

3. 查詢列印


void searchString(char *pcStr, int *pnFlag) {
    printf("\n=== 目前儲存內容 ===\n");
    bool any = false;
    for (int i = 0; i < NFLAGLEN; i++) {
        if (pnFlag[i] == 1) {
            printf("%3d: %s\n", i, pcStr + i * 10);
            any = true;
        }
    }
    if (!any) printf("(空)\n");
    printf("====================\n\n");
}

主選單整合


int main(void) {
    char *pcStr = cStr;
    int *pnFlag = nFlag;
    int choice;

    while (1) {
        printf("1. 新增字串\n2. 刪除字串\n3. 查詢列印\n0. 結束\n請選擇:");
        if (scanf("%d", &choice) != 1) { while(getchar()!='\n'); continue; }
        while (getchar() != '\n');

        switch (choice) {
            case 1: addString(pcStr, pnFlag); break;
            case 2: delString(pcStr, pnFlag); break;
            case 3: searchString(pcStr, pnFlag); break;
            case 0: return 0;
            default: printf("無效選項!\n\n");
        }
    }
}

進階議題:變長字串與碎片整理

本實作限定定長,簡單高效。若需支援變長字串,面臨挑戰:

  • 刪除後留下的「洞」可能太小裝不下新字串 → 需首次適配/最佳適配演算法尋找足夠大的連續空間。
  • 若所有洞都不夠大,但總空閒空間足夠 → 需緊湊化:移動現有字串合併空洞(類比磁碟碎片整理)。
  • 或採用鏈式儲存:每字串分塊儲存,查詢時重組(增加複雜度)。

這正是檔案系統配置器面臨的核心問題。本程式可作為理解配置器原型的教學範例。

總結

定長字串陣列管理展示了「陣列 + 位圖/旗標」的經典資料結構模式:O(1) 存取、O(N) 分配/掃描、零碎片(定長特性)。理解此模型有助於進階學習記憶體池、物件池、檔案系統區塊管理等核心系統元件。

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