Я создал программу, которая будет читать текстовый файл и помещать слова в виде строк в связанный список вместе с их частотой в текстовом файле. Он печатает только одно вхождение каждого слова с общим временем его появления.
Моя программа также загружает черный список, в котором предполагается сравнить черный список, связанный со списком слов (или частотой слов), и затем удалить черные слова из списка частот.
Я пытался сделать это несколькими способами. Ниже моя третья версия. То, что я хочу сделать, это добавить логическое значение к каждому узлу, и когда один узел равен слову в черном списке, логическое значение будет истинным. Тем не менее, я не могу распечатать его с помощью следующего кода. Я искал, и я не могу найти правильный синтаксис для добавления логического значения к узлу в связанном списке.
РЕДАКТИРОВАТЬ № 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");
}
Это не завершено, но это насколько я получил. Проблема в том, что он печатает только true, и не печатает false, если. Даже если я переключу значения, он все равно будет печатать только истинные if. Поэтому я предполагаю, что поступаю неправильно. Каким будет правильный способ «пометить» узел как истинный и «пометить» узел как ложный? Все команды предназначены для отладки. Я удалю или прокомментирую это позже.
Прежде всего, вы всегда можете пошагово отлаживать, чтобы увидеть, какая часть кода замораживает вашу комп. Лучший способ обнаружить утечки памяти — использовать Valgrind.
Кстати, я бы реализовал эту функцию сравнения как оператор сравнения, а также реализовал оператор сравнения для их узлов (для удобства). Это немного разделяет код и помогает позже понять, в чем ваша проблема. Это также лучший способ сделать это (более читабельным, ООП-у и т. Д.).
В заключение!!
Благодаря большому количеству устаревших модных отладок и утверждений, я наконец-то получил то, что хотел. Я знаю, что это могло бы быть легко для некоторых, но с не очень знакомым со связанными списками, это был довольно сложный процесс для меня.
Прежде, чем я пытался удалить слова, которые были замечены в черном списке связанный список из 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 *******************************************/
}
Так что в основном это функция сравнения, которая помечает узлы, найденные в другом списке. Хорошо работает и проверено со всеми остальными вариантами.