如何使用指针连接两个不同的节点类型(结构)?

时间:2017-07-04 20:59:38

标签: c++ pointers struct containers

我一直试图弄清楚如何使用指针连接两个不同的struct节点。但我没能做到这一点。请看我的画面。在左边我 有一个" treeNode"有两个指针(下方和右方)。 r指针连接到一个名为" branchNode"的另一个节点。并为每个" treeNode"我有五个链接" branchNodes"。

这是我的问题:例如,如果" branchNode" 1 不存在,我想创建一个临时节点 插入它。但我不知道如何制作这个临时节点 接收" branchNode"的内存地址2。

see image here \ n请看下面的代码:

  

的main.cpp

#include "table.h"
#include <iostream>

int main(){

    Table xxx;

    xxx.addTreeNodes(2,100);
    xxx.addTreeNodes(3,100);
    xxx.addTreeNodes(1,100);

    return 0;
  

table.h

#ifndef TABLE_H_
#define TABLE_H_

class Table{
public:
    Table();
    int treeAddress(int newAddress, int dim);
    void addTreeNodes(int pos, int value);


private:
    struct treeNode {
    public: class branchNode;
        int address;
        treeNode* right;
        treeNode* below;
    };

    struct branchNode : public treeNode{
        int address;
        int data;
        branchNode* next;
    };

    treeNode* treeCurr;
    treeNode* treeTemp;
    treeNode* head;
    branchNode* branchHead;

    int branchDim;

};

#endif
  

table.cpp

#include "table.h"
#include <iostream>
#include <stddef.h>

Table::Table(){
    branchDim = 5;
    head = NULL;
    treeTemp = NULL;
    treeCurr = NULL;

    branchHead = NULL;

}

int Table::treeAddress(int Address, int dim){
    // This function is used to calculate the address
    // of treeNodes.
    float val = 1 + (int)((float)Address/(float)dim);
    if (Address % dim == 0){
        val--;
    }

    return val;
}

void Table::addTreeNodes(int pos, int value){
    // This part will create one treeNode in order, if
    // needed. Works fine, just skip this part.
    treeNode* tn = new treeNode;
    tn -> address = treeAddress(pos, branchDim);

    // if the table doesn't exist. Create one treeNode
    if (head == NULL){
        tn -> below = NULL;
        tn -> right = NULL;
        head = tn;
    }
    else{
        // insert treeNode before.
        if(tn -> address < head -> address){
            tn -> below = head;
            tn -> right = NULL;
            head = tn;
        }
        else{
            treeCurr = head;    
            treeTemp = head;
            while(treeCurr != NULL && treeCurr -> address < tn -> address){
                treeTemp = treeCurr;
                treeCurr = treeCurr -> below;
            }

            // insert treeNode on tail.
            if (treeCurr == NULL && tn -> address > treeTemp -> address){ 
                treeTemp -> below = tn;
                tn -> below = treeCurr;
                tn -> right = NULL;
            }
            else{ 
            // insert treeNode between two others nodes.
                if (tn -> address < treeCurr -> address){
                    treeTemp -> below = tn;
                    tn -> below = treeCurr;
                    tn -> right = NULL;
                }
                else{
                    delete[] tn;
                }
            }
        }
    }

    // This part will create one branchNode. Here is the big problem...

    branchNode* bn = new branchNode;
    bn -> address = pos;

    treeCurr = head;
    int tPos = treeAddress(pos, branchDim);
    while(treeCurr != NULL && tPos != treeCurr -> address){
        treeCurr = treeCurr -> below;
    }
    //If the branch is empty.
    if (treeCurr -> right == NULL){
        treeCurr -> right = bn;
        bn -> next = NULL;
        bn -> address = pos;
    }

    else{
        //Here I wanna put the branchNode before the first branchNode.
        if (pos < (treeCurr -> right) -> address){
            branchHead = treeCurr -> right; // for some reason, I don't know why,
            bn -> next = branchHead;        // I can't do that!!!!!!!!!!.
            treeCurr -> right = bn;
            bn -> data = value;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

假设只存在一个&#34; treeNode&#34;和一些&#34; branchNode&#34;为简单起见。我能够正确地指向另一种类型的节点,遵循@ Rabbid76的提示(谢谢!)。也许还有另一种方式,但我已经开心了。

  

的main.cpp

#include "table.h"
#include <iostream>

int main(){

    Table xxx;

    xxx.addTreeNodes(5,100);
    xxx.addTreeNodes(3,140);
    xxx.addTreeNodes(2,20);

    xxx.print();

    return 0;
}
  

table.h

#ifndef TABLE_H_
#define TABLE_H_

class Table{
public:
    Table();
    void addTreeNodes(int pos, int value);
    void print();

private:
    struct treeNode {
    public: class branchNode;
        treeNode* right;
        treeNode* below;
    };

    struct branchNode : public treeNode{
        int address;
        int data;
        branchNode* next;
    };

    branchNode* branchCurr;
    treeNode* head;
    treeNode* tn;
};

#endif
  

table.cpp

#include "table.h"
#include <iostream>
#include <stddef.h>

Table::Table(){
    head = NULL;
    branchCurr = NULL;
    tn = new treeNode;
}

void Table::addTreeNodes(int pos, int value){

    branchNode* bn = new branchNode;
    bn -> address = pos;
    bn -> data = value; 

    tn -> below = NULL;

    if (head == NULL){
        head = tn;
        bn -> next = NULL;
        tn -> right = bn;
    }           
    else{
        if (pos < ((branchNode*)head -> right) -> address){
            branchCurr = (branchNode*)head -> right;
            bn -> address = pos;
            bn -> data = value;
            tn -> right = bn;
            bn -> next = branchCurr;
        }
        else{
            delete[] bn;
        }
    }
}

void Table::print(){
    branchCurr = (branchNode*)head -> right;            
    while(branchCurr != NULL){
        std::cout << "address: " << branchCurr -> address 
                  << ", stored value: " << branchCurr -> data <<  std::endl;
        branchCurr = branchCurr -> next;
    }
}