繁体   English   中英

c ++-使用BST来实现策略表错误

c++-Use BST to implement stactic table error

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我用BST实现了一个静态表。 但是我不知道查找帮助功能有什么问题。 当搜索数据不在表中并且数据大于表中的数据时, exe将终止。 我认为关于指针有一些东西。

标头:

#include <iostream>
#include <cstddef>
using namespace std;

class Node{
    private:
    int key;
    Node* left;
    Node* right;
    public:
    Node(){left = nullptr;right = nullptr;}
    Node(int k,Node* l,Node* r)//构造函数
    {
        key = k;
        left = l;
        right = r;
    }
    ~Node(){};
    inline int get_key(){return key;}
    inline Node* rt(){return right;};
    inline Node* lt(){return left;};
    inline void setLeft(Node* r){left = r;}
    inline void setRight(Node* r){right = r;}
};
class BST:public Node{
    private:
        Node *root;
    public:
        BST(){root = nullptr;}//无参构造函数
        ~BST(){}//析构函数
        Node* get_root(){return this->root;}
        void insert(const int & elem);
        void create(BST&tree,const int n,const int a[]);//构造BST
        Node* inserthelp(Node* r,const int& elem);//插入数据
        int search(const int& elem);//查找
        void clear(){delete []root;}
};

cpp:

#include "static_table.h"

void BST::create(BST& tree,const int n,const int a[])
{
    for(int i = 0;i < n;i ++)
    {
        tree.insert(a[i]);
    }
}

Node* BST::inserthelp(Node* r,const int& elem)
{
    if(r == nullptr)
        return new Node(elem,nullptr,nullptr);
    if(elem < r->get_key())
        r->setLeft(inserthelp(r->lt(),elem));
    else
        r->setRight(inserthelp(r->rt(),elem));
    return r;
}

void BST::insert(const int &elem)
{
    root = inserthelp(root,elem);
}

int BST::search(const int& elem)
{
    int counts = 0;
    Node* p = root;
    while(p)
    {
        if(elem == p->get_key()) {counts++;return counts;}
        if(elem > p->get_key()) {counts++;p = p->rt();}
        if(elem < p->get_key()) {counts++;p = p->lt();}
    }
    return 0;
}

主要:

#include "static_table.h"

using namespace std;

int main()
{
    BST st;
    int m,n;
    cout<<"please input static table's size"<<endl;
    //cout<<"请输入静态表的数据个数:"<<endl;
    cin>>n;
    int a[n];
    cout<<"please input data"<<endl;
    for(int i = 0;i < n;i ++)
    {
        cin>>a[i];
    }
    st.create(st,n,a);
    cout<<"please input the number of data you wanna search"<<endl;
    cin>>m;
    int elem;
    cout<<"please input the data,end it with enter"<<endl;
    for(int i = 0;i < m;i ++)
    {
        cin>>elem;
        if(st.search(elem) != 0) cout<<"find "<<elem<<" "<<"compared counts:"<<st.search(elem)<<endl;
        else cout<<"Not Find!"<<endl;
    }
    return 0;
}

这是exe错误,请在此处输入图片描述

1 个回复

TL; DR

if (elem < p->get_key())

应该

else if (elem < p->get_key())

说明

search

if (elem > p->get_key())
{
    counts++;
    p = p->rt();
}
if (elem < p->get_key())
{
    counts++;
    p = p->lt();
}

如果elem大于p->get_key()允许将p推进到NULL节点而无需测试NULL

if (elem > p->get_key()) // true
{
    counts++;
    p = p->rt(); // No right node, so p now NULL
}
if (elem < NULL->get_key()) // UB and almost certainly a crash
{
    counts++;
    p = p->lt();
}
1 在c:分段错误中实施BST

我正在尝试在c中实现二进制搜索树。 我使用lldb跟踪我的代码,并发现函数PUT返回时,它返回键= 5和值= 9的节点指针,并将其分配给main中的节点指针P。 但是,当我将其传递给tree_walk函数并尝试打印所有内容时,它给了我一个分割错误。 谁能告诉我代码有什么问题。 谢谢 ...

2 BST在C ++错误

我试图在cpp上创建BST我在类Tree中完成了类Node,因为这是合乎逻辑的。 标头: 感叹: 我有一个错误 请问我做错了什么? 根此Node *,新Node(3)返回Node *,这是什么问题? 谢谢!!! ...

3 如何使用 BST 实现哈希表?

哈希表的另一个常见实现(除了链表)是使用 BST 作为底层数据结构。 我在网上搜索过,但找不到答案。 如何使用二叉搜索树实现哈希表? 的答案就像将 BST 包装到哈希表中一样,我认为这并不意味着使用 BST实现哈希表。 请告诉我put()和get()方法的代码。 ...

6 bst比较模板上的错误C2664

这个错误: 错误C2664:'Set :: Set(int(__cdecl *)(ElemType,ElemType))':无法将参数1从'int(__cdecl *)(CorrectionT&,CorrectionT&)'转换为'int(__cdecl *)(ElemType ,El ...

7 如何在 C++ 中为 BST 实现复制构造函数和重载相等运算符

我需要使用 C++ 为 BST 实现各种功能。 其中两个方法,复制构造函数和重载的相等运算符,我对它们的确切逻辑以及如何采用该逻辑并将其实际转换为代码感到困惑。 到目前为止,这是我认为逻辑应该如何工作的: 调用复制构造函数并使用相等重载运算符将复制树设置为等于本地树。 相等重载方法逐步访 ...

8 C泛型:如何实现BST键范围功能?

我想在C中实现两个在BST上运行的通用函数,并将其节点的键存储在返回给调用方的单链接列表中 。 一个功能存储BST的所有键,另一功能仅存储给定范围内的键。 这两个函数都执行“按顺序”访问,这意味着键以升序存储,并且在列表的末尾插入。 由于我没有找到要查找的伪代码,因此我试图找到一种方法 ...

9 插入BST会导致错误C ++

我已经实现了BST,当我插入一些值时,我在INSERT函数中得到了错误。 如果我将main函数中的-32替换为32( 参见main )它可以正常工作,但现在有错误。 我找不到它。 ...

10 尝试实现 BST 时 C++ 中的分段错误(核心转储)

我正在尝试使用链表创建 BST。 我试图在适当的时候向左或向右遍历我的树,直到找到一个空值,然后我尝试创建一个节点并在该位置给出一个值。 现在我得到了错误 分段错误(核心转储) 来自此代码(逻辑可能不正确,因为这是一项正在进行的工作) 样本输出 节点数 5 数据 12 左 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM