【发布时间】:2019-03-18 04:58:10
【问题描述】:
即使对我来说,这个问题听起来也非常令人困惑,而且它可能看起来很明显或已经回答,但我已经搜索了很多,虽然我发现了有趣的东西,但我没有找到完全适合我的问题的答案。这是一些 C 代码,可以更好地显示我的疑问:
typedef struct Node_struct {
char keyLine[100];
int occurrences;
struct Node* leftChild;
struct Node* rightChild;
struct Node* parent;
} Node;
typedef struct Tree_struct {
Node* root;
} Tree;
int insertNode(Tree* myTree, Node* newNode) {
...
Node* currentNode = myTree->root;
...
if (caseSenCmpString(newNode->keyLine, currentNode->keyLine) == -1) {
currentNode = (Node*)currentNode->leftChild;
}
...
}
这段代码正确吗?由于currentNode 是Node* 类型,而currentNode->leftChild 是struct Node* 类型,我必须转换(Node*)currentNode->leftChild 以便它可以分配给currentNode。但我不确定这是否正确、必要,或者是否有更好的方法来做同样的事情。
同样,我也有这个:
Node* coverNode = NULL;
...
coverNode->leftChild = (struct Node*)newNode;
【问题讨论】:
-
名称
Node是struct Node的同义词。 (对于任何typedef X Y;,Y成为X的同义词——在您的情况下,X是struct Node和Y是Node。)currentNode = (Node*)currentNode->leftChild;中的演员是不必要的,因为它是一个空操作——struct Node *和Node *类型是相同指针类型的两个名称。 -
@JonathanLeffler
typedef struct Node_struct { /* ... */ struct Node* leftChild; /* ... */ } Node;...struct Node_struct和struct Node和Node一样吗?我知道Node与struct Node_struct相同,但是用于声明结构成员的struct Node *呢? -
@JonathanLeffler 你以后可能会好好感谢我。嘘......去修理你的;)
-
@Swordfish:感谢您指出我误读了这个问题。我已经“调整”(扩展)我的答案来处理“实践”和“理论”。