I've been trying to figure out how to connect two different struct nodes using pointers. But I'm was not able to do that. See my draw bellow. At left I have a "treeNode" with two pointers (below and right). The r-pointer connect to a different node called "branchNode" and for each "treeNode" I have five linked "branchNodes".
我一直在试图弄清楚如何使用指针连接两个不同的struct节点。但我无法做到这一点。见下图。在左边我有一个带有两个指针(下方和右方)的“treeNode”。 r指针连接到一个名为“branchNode”的不同节点,对于每个“treeNode”,我有五个链接的“branchNode”。
Here is my problem: For example, if the "branchNode" 1 doesn't exist, I wound like to create a temporary node to insert it. But I don't know how to make this temporary node receive the memory address of the "branchNode" 2.
这是我的问题:例如,如果“branchNode”1不存在,我就像创建一个临时节点来插入它。但我不知道如何使这个临时节点接收“branchNode”2的内存地址。
see image here \nSee my code bellow:
看这里的图像\ 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 个解决方案
#1
0
Assuming there exist only one "treeNode" and some "branchNode" for simplicity. I was able to point correctly to another type of node, following the hint of @Rabbid76 (thanks!). Maybe there's another way, but I'm already happy.
假设为了简单起见,只存在一个“treeNode”和一些“branchNode”。我能够正确地指向另一种类型的节点,遵循@ 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;
}
}
#1
0
Assuming there exist only one "treeNode" and some "branchNode" for simplicity. I was able to point correctly to another type of node, following the hint of @Rabbid76 (thanks!). Maybe there's another way, but I'm already happy.
假设为了简单起见,只存在一个“treeNode”和一些“branchNode”。我能够正确地指向另一种类型的节点,遵循@ 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;
}
}