Я кодирую словарь Trie как assigment, C++. Я продолжаю получать ошибку при вставке определенных букв в словах, особенно «l» и «t», если они не являются первой буквой.Структура данных - Trie C++, вставлять слова. Доступ к определению нарушения доступа
Это ошибка
Необработанного исключения в 0x00EC5392 в A4Tries.exe: 0xC0000005: Access местоположения чтения нарушения 0x000032EC.
Проблема заключается в функции InsertTrie. Он разбивает на следующей строке
if (!current->branch[newkey[i] - 'a'])
Im так путать, как работает код для нагрузок тестовых слов и затем вводит как «sdfl» или «СФО», «FFDF» разбить программу. Если кто-нибудь сможет определить проблему, я буду очень благодарен. Благодарю.
const int LETTERS = 26;
typedef char Key[MAXLENGTH];
struct Trienode
{
Trienode *branch[LETTERS];
EntryType *ref;
};
class TrieType
{
public:
TrieType();
~TrieType();
TrieType(TrieType &originalTree);
void operator=(TrieType & originalTree);
void MakeEmpty();
void InsertTrie(Key newkey, EntryType *newentry);
EntryType * TrieSearch(Key target);
bool DeleteTrie(Key delkey);
void PrintTrie();
private:
Trienode * root;
};
TrieType::TrieType()
{
root = NULL;
}
TrieType::~TrieType()
{
}
TrieType::TrieType(TrieType &originalTree)
{
}
EntryType * TrieType::TrieSearch(Key target)
{
int i;
Trienode * current = root;
for (i = 0; i < MAXLENGTH && current; i++)
if (target[i] == '\0')
break;
else
current =
current->branch[target[i] - 'a'];
if (!current)
return NULL;
else
if (!current->ref)
return NULL;
return current->ref;
}
Trienode *CreateNode()
{
int ch;
Trienode *newnode = new Trienode;
for (ch = 0; ch < LETTERS; ch++)
newnode->branch[ch] = NULL;
newnode->ref = NULL;
return newnode;
}
void TrieType::InsertTrie(Key newkey, EntryType *newentry)
{
int i;
Trienode *current;
if (!root)
root = CreateNode();
current = root;
for (i = 0; i < MAXLENGTH; i++)
if (newkey[i] == '\0')
break;
else
{
if (!current->branch[newkey[i] - 'a'])
current->branch[newkey[i] - 'a'] = CreateNode();
current = current->branch[newkey[i] - 'a'];
}
if (current->ref != NULL)
cout << "\nTried to insert a duplicate key." << endl;
else
current->ref = newentry;
}
const int MAXLENGTH = 10;
class EntryType
{
public:
EntryType();
EntryType(char * key);
EntryType(EntryType & entry);
~EntryType();
bool operator== (const EntryType& item) const;
bool operator!= (const EntryType& item) const;
void EntryKey(char word[]);
void PrintWord();
private:
char entryKey[MAXLENGTH];
};
EntryType::EntryType()
{
}
EntryType::~EntryType()
{
}
void EntryType::EntryKey(char word[])
{
for (int i = 0; i < 10; i++)
{
entryKey[i] = word[i];
}
}
void EntryType::PrintWord()
{
cout << entryKey << endl;
}
В главном
void insert(TrieType & trie)
{
Key word;
cout << "Please enter the word you would like to enter: " << endl;
cin >> word;
EntryType* newEntry = new EntryType;
newEntry->EntryKey(word);
trie.InsertTrie(word, newEntry);
}
Вам действительно нужно опубликовать полный пример. –
Ошибка кода, похоже, предполагает, что 'newkey [i]' является строчной буквой. Поэтому я искал ваш полный код, чтобы найти повод поверить или не верить, что возможности, отличные от строчных букв, были отфильтрованы ранее. Независимо от того, какие части вашего кода должны были сделать, которые даже не были включены в то, что вы опубликовали. – JSF