C++ 节点数组声明

C++ 节点数组声明,c++,2-3-4-tree,C++,2 3 4 Tree,我正在尝试初始化node类中的节点数组,它们是私有成员: #include<iostream> #include<string> using namespace std; class Data { public: long data; Data(long dd) { data=dd; } void displaydata(

我正在尝试初始化node类中的节点数组,它们是私有成员:

    #include<iostream>
    #include<string>
    using namespace std;
    class Data
    {
    public:
        long data;
        Data(long dd)
        {
            data=dd;
        }
        void displaydata()
        {
            cout<<data <<"  "<<endl;
        }
    };
    class node
    {
//these are what i have changed
        const static int order=4;
        int numitems;
        node *parent;


    vector<node>childarray(order);
        vector<Data>itemarray(order-1);

    };
来自以下java代码

class DataItem
{
public long dData; // one data item
//--------------------------------------------------------------
public DataItem(long dd) // constructor
{ dData = dd; }
//--------------------------------------------------------------
public void displayItem() // display item, format “/27”
{ System.out.print(“/”+dData); }
//--------------------------------------------------------------
} // end class DataItem
////////////////////////////////////////////////////////////////
class Node
{
private static final int ORDER = 4;
private int numItems;
private Node parent;
private Node childArray[] = new Node[ORDER];
private DataItem itemArray[] = new DataItem[ORDER-1];
// -------------------------------------------------------------
// connect child to this node
public void connectChild(int childNum, Node child)
{
childArray[childNum] = child;
if(child != null)
child.parent = this;
}
// -------------------------------------------------------------
// disconnect child from this node, return it
public Node disconnectChild(int childNum)
{
Node tempNode = childArray[childNum];
childArray[childNum] = null;
return tempNode;
}
// -------------------------------------------------------------
public Node getChild(int childNum)
{ return childArray[childNum]; }
// -------------------------------------------------------------
public Node getParent()
{ return parent; }
// -------------------------------------------------------------
public boolean isLeaf()
Java Code for a 2-3-4 Tree 479
LISTING 10.1 Continued
{ return (childArray[0]==null) ? true : false; }
// -------------------------------------------------------------
public int getNumItems()
{ return numItems; }
// -------------------------------------------------------------
public DataItem getItem(int index) // get DataItem at index
{ return itemArray[index]; }
// -------------------------------------------------------------
public boolean isFull()
{ return (numItems==ORDER-1) ? true : false; }
// -------------------------------------------------------------
public int findItem(long key) // return index of
{ // item (within node)
for(int j=0; j<ORDER-1; j++) // if found,
{ // otherwise,
if(itemArray[j] == null) // return -1
break;
else if(itemArray[j].dData == key)
return j;
}
return -1;
} // end findItem
// -------------------------------------------------------------
public int insertItem(DataItem newItem)
{
// assumes node is not full
numItems++; // will add new item
long newKey = newItem.dData; // key of new item
for(int j=ORDER-2; j>=0; j--) // start on right,
{ // examine items
if(itemArray[j] == null) // if item null,
continue; // go left one cell
else // not null,
{ // get its key
long itsKey = itemArray[j].dData;
if(newKey < itsKey) // if it’s bigger
itemArray[j+1] = itemArray[j]; // shift it right
else
{
itemArray[j+1] = newItem; // insert new item
类数据项
{
public long dData;//一个数据项
//--------------------------------------------------------------
公共数据项(长dd)//构造函数
{dData=dd;}
//--------------------------------------------------------------
public void displayItem()//显示项,格式为“/27”
{System.out.print(“/”+dData);}
//--------------------------------------------------------------
}//结束类数据项
////////////////////////////////////////////////////////////////
类节点
{
私有静态最终整数顺序=4;
私有内部网络;
私有节点父节点;
私有节点childArray[]=新节点[顺序];
私有DataItem itemArray[]=新DataItem[ORDER-1];
// -------------------------------------------------------------
//将子节点连接到此节点
public void connectChild(int childNum,Node child)
{
childArray[childNum]=子级;
if(child!=null)
child.parent=这个;
}
// -------------------------------------------------------------
//断开子节点与此节点的连接,然后将其返回
公共节点断开子节点(int childNum)
{
Node tempNode=childArray[childNum];
childArray[childNum]=null;
返回临时节点;
}
// -------------------------------------------------------------
公共节点getChild(int childNum)
{返回childArray[childNum];}
// -------------------------------------------------------------
公共节点getParent()
{返回父项;}
// -------------------------------------------------------------
公共布尔isLeaf()
2-3-4树的Java代码479
清单10.1续
{return(childArray[0]==null)?true:false;}
// -------------------------------------------------------------
public int getNumItems()
{返回numItems;}
// -------------------------------------------------------------
public DataItem getItem(int-index)//在索引处获取DataItem
{return itemArray[index];}
// -------------------------------------------------------------
公共布尔值isFull()
{return(numItems==ORDER-1)?true:false;}
// -------------------------------------------------------------
public int findItem(长键)//返回
{//项(在节点内)
对于(int j=0;j=0;j--)//从右侧开始,
{//检查项目
if(itemArray[j]==null)//如果项为null,
continue;//向左走一个单元格
else//不为空,
{//获取它的密钥
long itsKey=itemArray[j].dData;
if(newKey
请帮助我轻松地转换代码,我必须将顺序声明为公共的吗?我已经尝试过,但它不起作用,我也尝试过在类外声明顺序,如 常量int节点::顺序=4 但是,我还没有成功,有什么问题?我需要数组,它包含成员,大小应该是顺序或4。当我在阅读书时,作者在写这本书的C++ java代码时说你需要什么,它是指针,所以我添加了指针,但是还没有成功。< /P> < P>线< /P>
node *childarray[]=new node[order];
Data *itemarray[]=new Data[order-1];
此处有错误。除了不能在类中这样赋值之外,您的声明也有错误。您将例如
childarray
声明为指针数组,但将其创建为简单数组。将声明更改为

node *childarray;
Data *itemarray;
要实际执行分配,必须在构造函数中执行

然而,我真的建议你使用(或可能)代替

编辑:使用
std::array

struct node
{
    static const int ORDER = 4;
    int numitems;
    node* parent;
    std::array<node*, ORDER> childarray;
    std::array<Data*, ORDER - 1> itemarray;

    node()
        : numitems{0},
          parent{nullptr},
          childarray{{nullptr}},
          itemarray{{nullptr}}
        { }
};
struct节点
{
静态常数整数阶=4;
int numitems;
节点*父节点;
std::array-childarray;
std::数组项数组;
节点()
:numitems{0},
父项{nullptr},
childarray{{nullptr}},
itemarray{{nullptr}}
{ }
};

现在
childarray
itemrarray
是指针数量分别为
ORDER
ORDER-1
的数组,所有指针都初始化为
nullptr
(现在
NULL
应该是什么).

但如何更改代码,使其与java代码相同?我可以发布java节点声明的完整代码,但不是big@AleksiBeriashvili看我修改过的答案。你能更接近Java的唯一方法是使用例如,而不是原始指针。我不能使用vector吗?当我需要检查某个值是否不等于NULL时,我会如果有东西不等于nullptr,该怎么办?@AleksiBeriashvili
std::vector
如果您想要一个可以添加到运行时的数组,或者如果您的标准库还没有
std::array
,那么@AleksiBeriashvili
std::vector就很好了。而且
nullptr
NULL
兼容。好的话,我会选择std::array,但第一个节点构造函数有语法er罗尔
struct node
{
    static const int ORDER = 4;
    int numitems;
    node* parent;
    std::array<node*, ORDER> childarray;
    std::array<Data*, ORDER - 1> itemarray;

    node()
        : numitems{0},
          parent{nullptr},
          childarray{{nullptr}},
          itemarray{{nullptr}}
        { }
};