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

C 語言單詞匹配鏈表實現錯誤修正:指針類型聲明與邏輯缺陷分析

     編輯:程式設計綜合問答

主要錯誤

  1. 結構體指針聲明錯誤:
    struct letters next; → 應為 struct letters *next;。
  2. load() 重複聲明局部 head:
    函數內 NODE *head; 遮蔽全局 head,導致鏈表掛載失敗,函數結束局部變量銷毀,全局 head 仍為 NULL。
  3. 查找函數重複調用 load():
    每次查找都重新讀取文件、重建鏈表,極其低效且邏輯錯亂。
  4. IsOneCharDifferent 邏輯錯誤:
    if(p->lenth!=len) return 0; 放在循環內導致首個不匹配長度直接返回,且字符比較循環條件 c < lenth 拼寫錯誤。

修正架構

// 全局頭指針
NODE *g_head = NULL;

// 僅程序啟動時調用一次
void loadDictionary() {
    FILE *fp = fopen("letters.txt", "r");
    if (!fp) return;
    NODE *tail = NULL;
    while (!feof(fp)) {
        NODE *p = malloc(sizeof(NODE));
        if (fscanf(fp, "%s %d %d", p->letter, &p->num, &p->lenth) != 3) {
            free(p); break;
        }
        p->next = NULL;
        if (!g_head) g_head = p;
        else tail->next = p;
        tail = p;
    }
    fclose(fp);
}

// 查找完全匹配
int findExact(char *word) {
    int len = strlen(word);
    for (NODE *p = g_head; p; p = p->next) {
        if (p->lenth == len && strcmp(p->letter, word) == 0)
            return p->num;
    }
    return 0;
}

// 查找相差一字符 (長度相同)
int findOneDiff(char *word) {
    int len = strlen(word);
    for (NODE *p = g_head; p; p = p->next) {
        if (p->lenth != len) continue;
        int diff = 0;
        for (int i = 0; i < len; i++) {
            if (p->letter[i] != word[i]) diff++;
            if (diff > 1) break;
        }
        if (diff == 1) return p->num;
    }
    return 0;
}

// 查找長度差 1
int findLenDiffOne(char *word) {
    int len = strlen(word);
    for (NODE *p = g_head; p; p = p->next) {
        if (abs(p->lenth - len) == 1) return p->num; // 簡化:僅返回第一個
    }
    return 0;
}

關鍵改進

  • 全局鏈表僅加載一次。
  • 修正指針聲明與鏈表構建邏輯。
  • 分離三種匹配邏輯,邊界條件清晰。
  • 釋放內存:程序結束前遍歷鏈表 free。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved