首页 > 解决方案 > C ++树数据结构与字符串的访问冲突

问题描述

我正在尝试用 C++ 制作一个树形数据结构。最初我用 int 数据进行了测试,一切正常。但是,当我尝试使用字符串数据类型时,它一直显示未处理的异常。它说读取访问冲突,这是 0x5D。我不知道是什么导致了错误。仅将 int 更改为 string 的完全相同的代码会导致违规。

主要的:

#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 : ";
    }

}

头文件:

#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

实现文件:

#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);
}

标签: c++pointersrecursionbinary-treebinary-search-tree

解决方案


推荐阅读