我一直试图弄清楚如何使用指针连接两个不同的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;
}
}
}
答案 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;
}
}