編寫此代碼以使用TRIE數據結構在字典中搜索單詞。這段代碼在使用make(Clang)和GCC的CS50 IDE編譯器上完美運行,並始終給出正確的答案,但是當我在GCC編譯器(TDM-GCC)上運行相同的代碼時,它會進入無限循環。它開始使用大量的RAM(512 MB直到我強制關閉它)。我所運行的代碼在兩種情況下都完全相同。同樣在這兩種情況下,代碼完美編譯。此TRIE算法代碼運行在CS50 IDE編譯器上,但在Windows上的TDM-GCC中進入無限循環
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
struct trieblock123;
typedef struct trieblock123 trieblock;
typedef trieblock *node;
struct trieblock123
{
char alphabet;
char reply[5];
node pnt;
};
typedef struct
{
node first;
int count;
}head;
void load(FILE* dict, head* header);
void init(node pointer);
int main(void)
{
FILE* dict = fopen("large", "r");
head* header = malloc(sizeof(head));
(*header).count = 0;
(*header).first = NULL;
node curtrie = NULL;
node temptrie = NULL;
node temptrie1 = NULL;
char temp;
temp = fgetc(dict);
int counter = 0;
temptrie = (node)(malloc(26 * sizeof(trieblock)));
int i;
for(i = 0; i < 26; i++)
{
(temptrie[i]).alphabet = (char)(((int)('a')) + i);
(temptrie[i]).pnt = NULL;
}
if(counter == 0)
{
(*header).first = temptrie;
}
while(((int)(temp) <= (int)('z') && (int)(temp) >= (int)('a')) || temp == '\n')
{
if(((int)(temp) > (int)('z') || (int)(temp) < (int)('a')) && temp != '\n')
break;
curtrie = temptrie;
while(temp != '\n')
{
char temp1;
temp1 = fgetc(dict);
if((curtrie[(int)(temp) - (int)('a')]).pnt == NULL)
{
if(temp1 != '\n')
{
temptrie1 = (node)(malloc(26 * sizeof(trieblock)));
for(i = 0; i < 26; i++)
{
(temptrie1[i]).alphabet = (char)(((int)('a')) + i);
(temptrie1[i]).pnt = NULL;
}
(curtrie[(int)(temp) - (int)('a')]).pnt = temptrie1;
curtrie = temptrie1;
}
else
{
strcpy((curtrie[(int)(temp) - (int)('a')]).reply, "yes");
}
}
else if((curtrie[(int)(temp) - (int)('a')]).pnt != NULL)
{
curtrie = (curtrie[(int)(temp) - (int)('a')]).pnt;
}
fseek(dict, -1 * sizeof(char), SEEK_CUR);
temp = fgetc(dict);
}
if(temp == '\n')
{
temp = fgetc(dict);
}
counter++;
}
(*header).count = counter;
char tocheck[100];
scanf("%s", tocheck);
i = 0;
node start = NULL;
start = temptrie;
for(i = 0; i < strlen(tocheck); i++)
{
char cha = tocheck[i];
if(i != strlen(tocheck) - 1)
{
if((start[(int)(cha) - (int)('a')]).pnt == NULL)
{
printf("mis-spelled\n");
break;
}
else
{
start = (start[(int)(cha) - (int)('a')]).pnt;
}
}
else
{
if(strcmp(((start[(int)(cha) - (int)('a')]).reply), "yes") == 0)
{
printf("correctly spelled\n");
break;
}
else
{
printf("mis-spelled\n");
break;
}
}
}
return 0;
}
所以通過代碼在調試器,並找出什麼不正常。它編譯並不意味着它是正確的。 –
(副詞)爲什麼(動詞)是(名詞)一切(動詞)鑄造? – ThingyWotsit
沒有分析,while語句中的複合表達式看起來很可疑,僅僅是因爲它們的複雜性。 – ThingyWotsit