Сравнение одного списка ссылок с другим черным списком и переполнение стека в списке частот слов

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

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

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

РЕДАКТИРОВАТЬ № 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. Поэтому я предполагаю, что поступаю неправильно. Каким будет правильный способ «пометить» узел как истинный и «пометить» узел как ложный? Все команды предназначены для отладки. Я удалю или прокомментирую это позже.

0

Решение

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

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

0

Другие решения

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

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

Прежде, чем я пытался удалить слова, которые были замечены в черном списке связанный список из 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

По вопросам рекламы [email protected]