我正在尝试编写一个程序来播放“Pangolin”(就像这个人一样- 它问是/否问题,沿着二叉树走直到它到达叶节点。然后它“猜测”,如果用户说答案是错误的,询问用户他们在想什么,并提出一个将其与错误猜测区分开来的问题。然后将新数据添加到树中)。
这是我的树节点结构。NodeType 对于包含问题的节点是 QUESTION_NODE,对于包含“对象”的节点是 OBJECT_NODE - 这是程序推断用户正在考虑的事情。问题节点具有指向子节点的指针 - 一个表示是,一个表示否。
typedef struct _TreeNode {
NodeType type;
union {
char* question;
char* objectName;
} nodeString;
//children for yes and no answers: will be invalid when type is OBJECT_NODE
struct _TreeNode* yes;
struct _TreeNode* no;
} TreeNode;
由于这是一个学习练习,我试图用双指针来做。这是应该向树中添加问题节点的函数:
void addData(TreeNode** replace, char* wrongGuess) {
//create a new object node for what the user was thinking of
// ... (code to get user input and build the new object node struct) ... //
//create a new question node so we don't suck at pangolin so much
// ... (code to get a question from the user and put it in a question node struct) ... //
//link the question node up to its yes and no
printf("What is the answer for %s?\n", newObjectName);
if (userSaysYes()) {
newQuestionNodePtr->yes = newObjectNodePtr;
newQuestionNodePtr->no = *replace;
}
else {
newQuestionNodePtr->no = newObjectNodePtr;
newQuestionNodePtr->yes = *replace;
}
//redirect the arc that brought us to lose to the new question
*replace = newQuestionNodePtr;
}
然后调用 addData函数:
void ask(node) {
//(... ask the question contained by "node" ...)//
//get a pointer to the pointer that points to the yes/no member pointer
TreeNode** answerP2p;
answerP2p = userSaysYes() ? &(node.yes) : &(node.no);
//(... the user reports that the answer we guessed was wrong ...)//
puts("I am defeated!");
//if wrong, pass the pointer to pointer
addData(answerP2p, answerNode.nodeString.objectName);
我的(可能是错误的)理解是这样的:
在“ask()”中,我向 addData 传递了一个指针,该指针指向“node”的成员“yes”(或 no)。该成员又是一个指针。当我在 addData 中分配给“*replace”时,这应该修改结构,将其“是”(或否)成员指针重定向到指向我创建的新问题节点。
我调试了一下,发现newQuestionNode和newObjectNode创建成功。newQuestionNode 的子节点已正确分配。但是,新的问题节点不会插入到树中。“*replace = newQuestionNodePtr”行没有我期望的效果,并且“询问”范围内的“节点”引用的节点没有重定向其子指针。
谁能看出我的理解有什么问题?或者也许是我没有在我的代码中正确表达它的一种方式?抱歉这个问题太长了。