Я создал программу, которая будет читать текстовый файл и помещать слова в виде строк в связанный список вместе с их частотой в текстовом файле. Он печатает только одно вхождение каждого слова с указанием общего количества его появления.

Моя программа также загружает черный список, в котором предполагается, что он сравнивает связанный список черного списка со связанным списком облака слов (или частоты слов), а затем удаляет слова из черного списка из списка частотности слов.

Я пробовал сделать это несколькими способами. Ниже представлена ​​моя 3-я версия. Я хочу добавить логическое значение к каждому узлу, и когда один узел равен слову в черном списке, логическое значение будет истинным. Однако я не могу правильно распечатать его со следующим кодом. Я искал и не могу найти правильный синтаксис для добавления логического значения к узлу в связанном списке.

РЕДАКТИРОВАТЬ № 3:

void wordCloud::compareWith(wordCloud& wordList, wordCloud& badList){
wordNode *wordListTemp, *blacklistTemp, *temp = NULL;
unsigned int counter = 0;

for (blacklistTemp = badList.head; blacklistTemp; blacklistTemp = blacklistTemp->next){
    cout << blacklistTemp->myWord << "\n";
    for (wordListTemp = wordList.head; wordListTemp; wordListTemp = wordListTemp->next){

        if (wordListTemp->myWord != blacklistTemp->myWord){

            wordListTemp->blacklist = false;
            if (wordListTemp->blacklist = false){
                cout << wordListTemp->myWord << " <"
                    << wordListTemp->freq_count << ">\n";
            }
        }
        else if (wordListTemp->myWord == blacklistTemp->myWord){
            cout << blacklistTemp->myWord << " " << wordListTemp->myWord << "\n";
            wordListTemp->blacklist = true;
            if (wordListTemp->blacklist = true)
                cout << wordListTemp->myWord << "\n";
        } 
    }
    //counter++;
    cout << blacklistTemp->myWord << " " << wordListTemp->myWord << "\n";
}

system("pause");
}

Это не все, но насколько я знаю. Проблема в том, что он печатает только истинное if и не печатает ложное if. Даже если я переключу значения, он все равно будет печатать только истинные if. Так что я предполагаю, что поступаю неправильно. Каким будет правильный способ «пометить» узел как истинный и «пометить» узел как ложный? Все cout предназначены для отладки. Я удалю или закомментирую их позже.

0
Charles Williams 4 Мар 2014 в 11:50
1
Это наивная реализация, но почему бы просто не сделать два цикла while, один внутри другого? Вы просматриваете черный список на внешнем, а во внутреннем сравниваете свое текущее слово черного списка со всеми словами вашего списка слов? Его, очевидно, можно оптимизировать, но, по крайней мере, это даст вам рабочий старт.
 – 
o_weisman
4 Мар 2014 в 12:02
Да, возможно, я слишком много в этом разбираюсь. Собственно, это я сейчас и пытаюсь сделать. Я немного медлителен с решением проблем переноса кода, поэтому я отпишусь, если будет какой-то успех.
 – 
Charles Williams
4 Мар 2014 в 12:09
- Я пытался это сделать, но, похоже, ничего не добился. Я разместил код выше, но программа все равно зависает.
 – 
Charles Williams
4 Мар 2014 в 12:37
Следующая строка неверна: if (blacklistTemp == wordListTemp) Вы сравниваете две ячейки памяти друг с другом, и они, очевидно, не являются одной и той же ячейкой памяти (если бы они были, это было бы еще хуже). Вам нужно сравнить wordListTemp->myWord с blackListTemp->myWord. ОН, и он зависает, потому что нужно поставить строку wordListTemp = wordListTemp->next; вне блока if.
 – 
o_weisman
4 Мар 2014 в 12:43
Я думаю, вам все равно нужно научиться отлаживать свой код. Если это настолько очевидно, что я могу видеть ошибки без отладки, это не следует спрашивать на форуме, честно.
 – 
o_weisman
4 Мар 2014 в 12:45

2 ответа

Лучший ответ

В заключение!!

С большим количеством устаревших операторов отладки и cout я наконец получил то, что хотел. Я знаю, что для некоторых это могло быть легко, но, поскольку я не очень хорошо разбирался в связанных списках, для меня это был довольно сложный процесс.

Раньше я пытался удалить слова, которые были замечены в связанном списке черного списка, из связанного списка wordList. Позже я решил просто попытаться добавить логическое значение true к узлам в wordList, а затем настроить мою функцию печати, чтобы не печатать узлы со значением true. Мне также пришлось настроить несколько вещей в insertWord() и моих функциях freqSort(), но все, что на самом деле состояло, - это добавление указателя на логическое значение при создании нового узла.

Моя функция-член - void wordCloud::compareWith(wordCloud& wordList, wordCloud& badList), и она является частью моего класса wordCloud. Вот следующее определение:

void wordCloud::compareWith(const wordCloud& wordList, const wordCloud& badList){
wordNode *wordListTemp, *blacklistTemp;
unsigned int counter = 0;

//loop that advances wordListTemp
for (wordListTemp = wordList.head; wordListTemp; wordListTemp = wordListTemp->next){
    blacklistTemp = badList.head;

    //loop advances blacklistTemp - compares links in wordList to badList(blacklist)
    //and sets the node to true if myWord equals any word in the blacklist
    while (blacklistTemp){          
        if (wordListTemp->myWord == blacklistTemp->myWord){
            wordListTemp->blacklist = true; 
            counter++;
        }
        blacklistTemp = blacklistTemp->next;
    }

    //for debugging
    //cout << blacklistTemp->myWord << " " << wordListTemp->myWord << "\n";     
}

/*********************  All for debugging  ***************************************
cout << "True:\n\n";
wordListTemp = wordList.head;       //reset wordListTemp to head    

while (wordListTemp){               //print blacklisted words from wordList
    if (wordListTemp->blacklist == true){
        cout << wordListTemp->myWord << " <"
            << wordListTemp->freq_count << ">\n";
    }
    wordListTemp = wordListTemp->next;
}
//prints total words blacklisted
cout << "There are " << counter << " blacklisted words.";                   

cout << "\n\nFalse:\n\n";
wordListTemp = wordList.head;       //reset wordListTemp to head    
counter = 0;

while (wordListTemp){               //print non-blacklisted words from wordList
    if (wordListTemp->blacklist == false){
        cout << wordListTemp->myWord << " <"
            << wordListTemp->freq_count << ">\n";
        counter++;
    }
    wordListTemp = wordListTemp->next;
}
//prints total words not blacklisted
cout << "There are " << counter << " words that are not blacklisted.\n";

system("pause");    
********************  End debugging *******************************************/    
}

По сути, это функция сравнения, которая помечает узлы, которые находятся в другом списке. Хорошо работает и проверено со всеми другими вариантами.

0
Charles Williams 5 Мар 2014 в 09:22

Прежде всего, вы всегда можете выполнить отладку шаг за шагом, чтобы увидеть, какая часть кода останавливает ваш компьютер. Лучшим способом обнаружения утечек памяти было бы использование Valgrind.

Кстати, я бы реализовал эту функцию сравнения как оператор сравнения, а также реализовал бы оператор сравнения для их узлов (для удобства). Это немного разделяет код и помогает позже понять, в чем заключается ваша проблема. Это также лучший способ сделать это (более читаемый, ООП-у и т. Д.).

0
poli_g 4 Мар 2014 в 19:18
Не совсем уверен, как это сделать или понять, что именно вы говорите.
 – 
Charles Williams
4 Мар 2014 в 16:42
Какую часть вы не поняли? Valgrind или операторы?
 – 
poli_g
4 Мар 2014 в 19:17
Операторы и реализация в качестве оператора сравнения. Я знаю, что такое операторы сравнения, но не знаю, как «реализовать» решение в качестве оператора сравнения. Вы говорите о перегрузке?
 – 
Charles Williams
4 Мар 2014 в 19:21