数据结构——TIE C++,发布插入词。访问冲突读取位置 我把字典TIE编码为一个附件,C++。在单词中插入某些字母时,我经常会遇到错误,尤其是“l”和“t”,如果它们不是第一个字母的话
这就是错误所在 A4Tries.exe中0x00EC5392处的未处理异常:0xC0000005:访问冲突读取位置0x000032EC 问题在于InsertTrie函数。它在下一行中断数据结构——TIE C++,发布插入词。访问冲突读取位置 我把字典TIE编码为一个附件,C++。在单词中插入某些字母时,我经常会遇到错误,尤其是“l”和“t”,如果它们不是第一个字母的话,c++,data-structures,trie,search-tree,C++,Data Structures,Trie,Search Tree,这就是错误所在 A4Tries.exe中0x00EC5392处的未处理异常:0xC0000005:访问冲突读取位置0x000032EC 问题在于InsertTrie函数。它在下一行中断 if (!current->branch[newkey[i] - 'a']) 我很困惑,因为代码用于加载测试词,然后输入像“sdfl”或“sfd”、“ffdf”会破坏程序。如果有人能发现这个问题,我将不胜感激。谢谢 const int LETTERS = 26; typedef char Key[MAXL
if (!current->branch[newkey[i] - 'a'])
我很困惑,因为代码用于加载测试词,然后输入像“sdfl”或“sfd”、“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]不是小写字母时,上述代码将current设置为garbage,然后下一次通过循环时使用current和seg故障 代码的其他部分应该负责确保在您到达这里时只有小写字母。但是,由于调试这部分代码的任何人都看不到这一点,因此应该有一个断言
{
assert( newkey[i]>='a' && newkey[i]<='z' );
if (!current->branch[newkey[i] - 'a'])
current->branch[newkey[i] - 'a'] = CreateNode();
current = current->branch[newkey[i] - 'a'];
}
然后,您可以运行程序的调试版本,并找出故障是由允许字符(小写字母除外)到达此处的其他代码引起的,或者,您可以看到这不是一个问题,并更好地专注于查找一些不太可能出现的缺陷。您确实需要发布一个完整的示例。失败的代码似乎假定newkey[i]是小写字母。所以我搜索了你的完整代码,以找到任何理由相信或不相信除小写字母以外的其他可能性被过滤掉了。无论你的代码应该做什么,你发布的内容中都没有包含这些内容。
{
assert( newkey[i]>='a' && newkey[i]<='z' );
if (!current->branch[newkey[i] - 'a'])
current->branch[newkey[i] - 'a'] = CreateNode();
current = current->branch[newkey[i] - 'a'];
}