0

I am trying to make a tree data structure with c++. Originally I tested with int data, it was going fine. However, when I try to use a string data type, it keeps showing an unhandled exception. It said read access violation, this was 0x5D. I don't know what is causing the error. The complete same code only changing int to string causes the violation.

Main:

#include <bits/stdc++.h>
#include "Tree.h"
using namespace std;

int main()
{
    Tree A;
    int choice; bool isCre=0;

    cout << "Input choice : ";
    while (cin >> choice) {
        switch (choice)
        {
        case 1:
            if (!isCre) {
                A.create_tree(); isCre = 1;
                break;
            }
            else {
                A.add_tree();
                break;
            }
        case 2:
            A.delete_tree(); break;
        case 3:
            A.modify_tree(); break;
        case 4:
            A.display_tree(); break;
        }
        cout << "Input choice : ";
    }

}

Header file:

#ifndef TREE_H
#define TREE_H

#include <bits/stdc++.h>
using namespace std;

class Tree
{
private:
    struct Tre
    {
        Tre* parent; Tre* right; Tre* left;
        string data;
        Tre(Tre* parent, string data)
        {
            this->parent = parent;
            this->data = data;
            left = right = NULL;
        }
    };

    Tre* root;

    Tre* create(Tre*& root, string data)
    {
        Tre* p;
        p = new Tre(NULL, data);
        root = p;
        return root;
    }

    void dis(Tre* node)
    {
        if (node == NULL)
            return;

        cout << node->data << endl;

        dis(node->left);

        dis(node->right);
    }

    Tre* search(Tre* node, string data)
    {
        if (node == NULL)
            return NULL;

        if (node != NULL && node->data == data)
            return node;

        /* then recur on left subtree */
        Tre* p = search(node->left, data);
        // node found, no need to look further
        if (p != NULL && p->data == data) return p;

        /* node is not found in left,
        so recur on right subtree */
        Tre* q = search(node->right, data);
        if (q != NULL && q->data == data) return q;
    }

    Tre* add(Tre* root, string find, string input)
    {
        Tre* p = root;
        p = search(root, find);

        if (p->left != NULL)
        {
            p->right = new Tre(p, input);
            //p->left = new Tre(p, input);
        }
        else if (p->left == NULL)
        {
            p->left = new Tre(p, input);
            //p->right = new Tre(p, input);
        }

        return root;
    }

    Tre* del(Tre* root, string data)
    {
        Tre* p = root, * q;
        p = search(root, data);
        q = p->parent;
        if (q->right != NULL && q->right->data == data)
        {
            q->right = NULL;
            delete p;
        }
        else if (q->left->data == data)
        {
            q->left = NULL;
            delete p;
        }

        return root;
    }

    Tre* modify(Tre* root, string find, string input)
    {
        Tre* p = root;
        p = search(p, find);

        p->data = input;

        return root;
    }

public:
    void create_tree();
    void display_tree();
    void add_tree();
    void delete_tree();
    void modify_tree();
};

#endif

#endif

Implementation file:

#include "Tree.h"

void Tree::create_tree()
{
    string data;
    cout << "Input data : "; cin >> data;
    create(root, data);
}

void Tree::display_tree()
{
    dis(root);
}

void Tree::add_tree()
{
    string find, input;
    cout << "Parent data : "; cin >> find;
    cout << "New data : "; cin >> input;
    add(root, find, input);
}

void Tree::delete_tree()
{
    string data;
    cout << "Delete data : "; cin >> data;
    del(root, data);
}

void Tree::modify_tree()
{
    string find, input;
    cout << "Find data : "; cin >> find;
    cout << "New data : "; cin >> input;
    modify(root, find, input);
}

HiM
  • 1
  • 1
  • 1
    Debugger should help you checking this kind of issue. – Louis Go Oct 18 '21 at 01:21
  • 1
    [Why should I not #include ?](https://stackoverflow.com/questions/31816095/why-should-i-not-include-bits-stdc-h) and [Why is "using namespace std;" considered bad practice?](https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice) – justANewb stands with Ukraine Oct 18 '21 at 01:27
  • 1
    Yet another error here? :Exception throw: q was nullptr ```if (q->right != NULL && q->right->data == data)``` when try delete root node – kenash0625 Oct 18 '21 at 01:31
  • @kenash0625 yes, but I don't understand why I am having exception only when I try to handle string data. – HiM Oct 18 '21 at 01:36

0 Answers0