2013-02-16 2 views
1

Редактировать, ладно. Итак, мой код в основном работает на данный момент. Я знаю, что в нем отсутствуют некоторые слова, которые должны быть написаны с ошибкой. Не знаю, почему.Заполнить массив связанных списков со словарным файлом

http://pastebin.com/DSNU16Bf

Эта ссылка имеет все другие ссылки на мои файлы. Поскольку, я могу отправлять только две ссылки за раз.

Если вы читаете файлы. Вы увидите, как все это работает. Я знаю, что это супер гетто. Я не мог понять способ игнорировать связанный список, если он начинался с другой буквы, все, что я делал, делал бесконечные циклы. Это компилируется и работает.

Это не поднимает все слова сленга.

+0

Пожалуйста, пост ** ** маленький образец вашего входного файла, несколько десятков строк должно быть достаточно, так долго, как формат соответствует. Благодарю. Примечание: опубликуйте его ** в добавлении к вашему вопросу; НЕ здесь в комментарии. ** Кроме того, определение «LENGTH» может вступить в игру здесь, поэтому, пожалуйста, включите это в свой источник. – WhozCraig

+0

Весь файл - это одно слово, за которым следует новая строка. Никаких случайных пустых строк или лишних пробелов или чего-либо или вида. Ничего, что влияет на переход. Я просто не могу обернуть голову вокруг кода, необходимого для перехода на следующий узел. Я попытался: if (strncmp (str1, str2,1)! = 0) { i ++ } И многие аналогичные попытки использования prev = wordArr [0], а затем сравнение предыдущей строки. Но он просто не работал, как я. – haincha

+0

Ваш код даже не компилируется «if (открыт) {« откуда происходит 'открытие? и вы говорите, что вы студент из Гарварда? –

ответ

2

Вот моя критика

bool load(const char* dictionary){ 
// TODO 
FILE *dict = fopen(dictionary, "r"); 
if(opened){ 
    fclose(dict); 
    return false; 
} 

Не знаю, где opened происходят из - думаю, вы открыли файл, прежде чем руки, и, следовательно, мы не знаем, если указатель файла находится в начале, конце, или где-то в средний

opened = true; 
if(dict == NULL || !dict){ 
    return false; 
} 

Почему !dict?

char line[LENGTH]; 
bool filling; 
for(int i = 0; i < LLLength; i++){ 
    struct dict_node *newNode; 
    newNode = malloc(sizeof(dict_node)); 
    wordArr[i] = newNode; 
    start[i] = wordArr[i]; 
} 

Итак, здесь вы строите 27 узлов. Это более простой вариант (то же)

for(int i = 0; i < LLLength; i++){ 
     struct dict_node *newNode; 
     start[i] = malloc(sizeof(dict_node)); 
    } 

Затем позволяет прочитать файл

while(!feof(dict)){ 
    for(int i = 0; i < LLLength; i++){ 
     filling = true; 
     while(filling) 
      fgets(line,LENGTH,dict); 

мы дойдем до этой точки (1 из 27 и линии не более 45 символов)

Так что давайте поместим его в этот массив. start[i] или wordArrd[i] что вы предпочитаете

Поскольку мы не знаем, если wordArr[i]->word является массивом символов или просто указатель - Я не могу помочь вам здесь

 strcpy(wordArr[i]->word,line); 
     prev = wordArr[i]; 

Теперь мы запутались. Вы начали с массива, но шизофрения установлена ​​- нам нужен связанный список.

  wordArr[i]->next = malloc(sizeof(dict_node)); 
      wordArr[i] = wordArr[i]->next; 
      fgets(line,LENGTH,dict); 
      strcpy(wordArr[i]->word,line); 
    } 
} 

...

fclose(dict); 
for(int i = 0; i < LLLength; i++){ 
    wordArr[i] = start[i]; 
    while(wordArr[i]->next != NULL){ 
     wordArr[i] = wordArr[i]->next; 
     count++; 
    } 
} 

int test = 0; 
wordArr[test] = start[test]; 
while(wordArr[test]->next != NULL){ 
    printf("%s",wordArr[test]->word); 
    wordArr[test] = wordArr[test]->next; 
} 
return true; 
} 
+0

Моя проблема не в том, что у меня есть код. Этого у меня нет. Я ценю несколько предложений, которые вы сделали, сделает мой код менее смешным. Если (открытая) часть - это потому, что есть проверка, чтобы убедиться, что я закрыл файл. Если по какой-либо причине словарь не закрыт раньше, он теперь. Настоящая проблема, с которой я столкнулся. Когда я читаю строку, я храню ее в слове wordArr [0] ->, и я хочу сравнить предыдущее слово со следующей строкой. Если они не начинаются с одного и того же первого символа, я хочу i ++ и добавить b в wordArr [1]. – haincha

+0

@haincha - Ваша логика повсюду - это не имеет никакого смысла. Что бы помочь вам хотя бы использовать структуру для 'wordArr' - хотите ли вы это как массив или связанный список? Трудно сказать из ОП. –

+0

struct dict_node * wordArr [LLLength]; Я знаю, что мой код повсюду. В настоящий момент мой код не является проблемой. Это моя логика. Я не знаю, как передать в коде, чтобы передать массив, чтобы переключиться на wordArr [1], когда приходит слово «b». Все, что я придумал с ошибками Seg, бесконечными циклами или заполняет весь словарь в узле [0]. Я хочу массив связанных списков. Массив a-z, каждый из которых имеет все буквы с соответствующей первой буквой. – haincha

Смежные вопросы