Я создал программу, которая будет читать текстовый файл и помещать слова в виде строк в связанный список вместе с их частотой в текстовом файле. Он печатает только одно вхождение каждого слова с указанием общего количества его появления.
Моя программа также загружает черный список, в котором предполагается, что он сравнивает связанный список черного списка со связанным списком облака слов (или частоты слов), а затем удаляет слова из черного списка из списка частотности слов.
Я пробовал сделать это несколькими способами. Ниже представлена моя 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 предназначены для отладки. Я удалю или закомментирую их позже.
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 *******************************************/
}
По сути, это функция сравнения, которая помечает узлы, которые находятся в другом списке. Хорошо работает и проверено со всеми другими вариантами.
Прежде всего, вы всегда можете выполнить отладку шаг за шагом, чтобы увидеть, какая часть кода останавливает ваш компьютер. Лучшим способом обнаружения утечек памяти было бы использование Valgrind.
Кстати, я бы реализовал эту функцию сравнения как оператор сравнения, а также реализовал бы оператор сравнения для их узлов (для удобства). Это немного разделяет код и помогает позже понять, в чем заключается ваша проблема. Это также лучший способ сделать это (более читаемый, ООП-у и т. Д.).
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.