主要錯誤
- 結構體指針聲明錯誤:
struct letters next; → 應為 struct letters *next;。
- load() 重複聲明局部 head:
函數內 NODE *head; 遮蔽全局 head,導致鏈表掛載失敗,函數結束局部變量銷毀,全局 head 仍為 NULL。
- 查找函數重複調用 load():
每次查找都重新讀取文件、重建鏈表,極其低效且邏輯錯亂。
- 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。