#c #function #class #pointers #binary-search-tree
#c #функция #класс #указатели #двоичное дерево поиска
Вопрос:
Это сообщение об ошибке, о котором идет речь: завершение вызывается после создания экземпляра ‘std:: length_error’ what(): basic_string:: _S_create Прервано
Это код, который его запускает. Этот раздел в main.cpp файл:
case '-': // DeleteItem
try
{
int id;
inputs >> id;
Student s(id, "NULL", "NULL");
cout << "DeleteItem('" << id << "') -- ";
s = tPtr->DeleteItem(s);
cout << "Deleted ";
s.Print();
}
Он никогда не проходит мимо tPtr-> DeleteItem (ов), и это код, используемый для DeleteItem (ов).
Функция DeleteItem:
template <typename SomeType>
SomeType BSTree<SomeType>::DeleteItem(SomeType item){
if (rootPtr == NULL){
throw EmptyBSTree();
}
Delete(rootPtr, item);
cout<<"done"<<endl;
}
Функция удаления:
template <typename SomeType>
void BSTree<SomeType>::Delete(BSTreeNode<SomeType>*amp; treePtr, SomeTypeamp; item){
if (treePtr->data == item){
DeleteNode(treePtr);
cout<<"done2"<<endl;
}
else{
if (item<treePtr->data){
if (treePtr->leftPtr != NULL){
Delete(treePtr->leftPtr, item);
}
else{
throw NotFoundBSTree();
}
}
else{
if (treePtr->rightPtr != NULL){
Delete(treePtr->rightPtr, item);
}
else{
throw NotFoundBSTree();
}
}
}
Функция deleteNode:
template <typename SomeType>
void BSTree<SomeType>::DeleteNode(BSTreeNode<SomeType>*amp; treePtr){
cout<<"here"<<endl;
BSTreeNode<SomeType>* temp = new BSTreeNode<SomeType>;
temp = treePtr;
if (treePtr->leftPtr == NULL amp;amp; treePtr->rightPtr == NULL){
delete temp;
}
else{
if (treePtr->leftPtr == NULL){
treePtr = treePtr->rightPtr;
delete temp;
}
else if (treePtr->rightPtr == NULL){
treePtr = treePtr->leftPtr;
delete temp;
}
else{
treePtr->data = GetPredecessor(treePtr->leftPtr);
Delete(treePtr->leftPtr,treePtr->data);
}
}
cout<<"I am here"<<endl;
}
Я нахожу это очень странным, поскольку все операторы cout, которые я ввожу, чтобы убедиться, что код попадает в эту строку, выводятся на терминал, поэтому он завершает обе функции, но никогда не проходит мимо исходной строки в main.cpp . Я очень смущен тем, почему я продолжаю получать эту ошибку.
РЕДАКТИРОВАТЬ: эта проблема была решена путем добавления возврата к DeleteItem . Однако я столкнулся с другой проблемой. Удаление, похоже, здесь не работает:
template <typename SomeType>
void BSTree<SomeType>::DeleteNode(BSTreeNode<SomeType>*amp; treePtr){
BSTreeNode<SomeType>* temp;
temp = treePtr;
if (treePtr->leftPtr == NULL amp;amp; treePtr->rightPtr == NULL){
delete temp;
cout<<"This is "<<treePtr->data<<endl;
}
else{
if (treePtr->leftPtr == NULL){
treePtr = treePtr->rightPtr;
delete temp;
}
else if (treePtr->rightPtr == NULL){
treePtr = treePtr->leftPtr;
delete temp;
}
else{
treePtr->data = GetPredecessor(treePtr->leftPtr);
Delete(treePtr->leftPtr,treePtr->data);
}
}
}
Дерево Ptr должно быть удалено, но оно выводится
Это (случайное число). Почему?
Комментарии:
1. Похоже, вам нужен оператор return
BSTree<SomeType>::DeleteItem
.2. Включите предупреждения вашего компилятора. Компиляторы с радостью предупредят о пропущенных операторах возврата.
3. @chris как мне это сделать? Я нахожусь на удаленном сервере Linux, но я могу быть на нем некоторое время, поэтому я бы предпочел
4. При выполнении
man gcc
вы получите понятный список всех параметров компиляции, включая тот, который вы ищете. Знакомы ли вы сman
командой и что она делает?5. Не совсем, но я прочитаю об этом!